어제의 나보다 성장한 오늘의 나

[백준][14499][Java] 주사위 굴리기 본문

알고리즘/백준(BOJ)

[백준][14499][Java] 주사위 굴리기

NineOne 2021. 1. 7. 00:17

www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도

www.acmicpc.net

문제풀이

해당 문제는 주사위의 이동만 신경 잘 쓴다면 쉽게 풀 수 있는 문제이다.

주사위의 바닥 변수를 따로 선언하였고, 2차원 배열로 주사위 면을 표현해서 방향에 따라 bottom과 배열의 위치가 바뀌도록 하였다.

코드

import java.io.*;
import java.util.*;

public class Main {
	static int N, M, diceX, diceY, K, bottom;
	static int[][] map;
	static int[] dx = {0,0,-1,1};
	static int[] dy = {1,-1,0,0};
	static int[][] dice = {{0,0,0},{0,0,0},{0,0,0}};
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		diceX = Integer.parseInt(st.nextToken());
		diceY = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		map = new int[N][M];
		
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<K; i++) {
			int dis = Integer.parseInt(st.nextToken())-1;
			
			int x = diceX + dx[dis];
			int y = diceY + dy[dis];
			
			//범위 오버 무시
			if( x< 0 || x>=N || y<0 || y>=M) continue;
			
			diceX = x;
			diceY = y;
			
			changeDice(dis);
			checkBottom();
			
			System.out.println(dice[1][1]);
		}
	}

	private static void checkBottom() {
		if(map[diceX][diceY] == 0) map[diceX][diceY] = bottom;
		else {
			bottom = map[diceX][diceY];
			map[diceX][diceY] =0;
		}
	}

	private static void changeDice(int dis) {
		int temp =0;
		
		//방향에 따라 주사위 값 이동
		switch(dis) {
		case 0:
			temp = bottom;
			bottom = dice[1][2];
			for(int i=2; i>0; i--) {
				dice[1][i] = dice[1][i-1];
			}
			dice[1][0] = temp;
			break;
		case 1:
			temp = bottom;
			bottom = dice[1][0];
			for(int i=0; i<2; i++) {
				dice[1][i] = dice[1][i+1];
			}
			dice[1][2] = temp;
			break;
		case 2:
			temp = bottom;
			bottom = dice[0][1];
			for(int i=0; i<2; i++) {
				dice[i][1] = dice[i+1][1];
			}
			dice[2][1] = temp;
			break;
		case 3:
			temp = bottom;
			bottom = dice[2][1];
			for(int i=2; i>0; i--) {
				dice[i][1] = dice[i-1][1];
			}
			dice[0][1] = temp;
			break;
		}
		
	}
}
Comments