유블로그

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

알고리즘

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

yujeong kang 2021. 2. 2. 01:01

baekjoon 14499 주사위굴리기

삼성 sw 역량 기출

 

소요시간 : 42분

 

문제 이해하는데만 20분 넘게 걸렸다... ^^

동쪽으로 이동할 땐 동쪽으로 주사위를 굴리고

서쪽으로 이동할 땐 서쪽으로 주사위를 굴려야 한다.

 

문제에서 주어진 주사위 단면을 배열로 두고 풀었다. 

동쪽으로 이동하는 경우 주사위의 1행과 밑면인 [3][1] 을 오른쪽으로 이동시키고

서쪽은 왼쪽으로 이동시켜야 한다.

 

남쪽은 주사위의 1열을 밑으로 이동시키고

북쪽은 주사위의 1열을 위로 이동시켜야 한다.

 

코드가 굉장히.. ^^ 하드코딩느낌

switch문을 좀 for 문으로 가능하게 빼야할 것 같다.

그것은 지금부터 생각해보는걸로

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static int N, M, x, y, K;
	static int[][] map;
	static int[][] dir = { {0,0},{0,1},{0,-1},{-1, 0},{1, 0} };	// [0]은 의미없는 숫자임
	static int[][] dice = {
			{0, 0, 0},
			{0, 0, 0},
			{0, 0, 0},
			{0, 0, 0},
	};	// 밑 면 인덱스 : (3, 1)
	
	public static void main(String[] args) throws 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());
		x = Integer.parseInt(st.nextToken());
		y = 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());
		int d;
		for (int i = 0; i < K; i++) {
			d = Integer.parseInt(st.nextToken());
			
			x += dir[d][0];
			y += dir[d][1];
			
			if(x < N && y < M && x >= 0 && y >= 0) {
				int tmp;
				switch(d) {
				case 1:
					tmp = dice[3][1];
					dice[3][1] = dice[1][2];
					dice[1][2] = dice[1][1];
					dice[1][1] = dice[1][0];
					dice[1][0] = tmp;
					break;
				case 2:
					tmp = dice[3][1];
					dice[3][1] = dice[1][0];
					dice[1][0] = dice[1][1];
					dice[1][1] = dice[1][2];
					dice[1][2] = tmp;
					break;
				case 3:
					tmp = dice[0][1];
					dice[0][1] = dice[1][1];
					dice[1][1] = dice[2][1];
					dice[2][1] = dice[3][1];
					dice[3][1] = tmp;
					break;
				case 4:
					tmp = dice[3][1];
					dice[3][1] = dice[2][1];
					dice[2][1] = dice[1][1];
					dice[1][1] = dice[0][1];
					dice[0][1] = tmp;
					break;
				}
				if(map[x][y] == 0) {
					map[x][y] = dice[3][1];
				}
				else {
					dice[3][1] = map[x][y];
					map[x][y] = 0;
				}
				System.out.println(dice[1][1]);
			}
			else {
				x -= dir[d][0];
				y -= dir[d][1];
			}
		}
	
	} // main
}