Koala - 11기/코딩테스트 준비 스터디

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

알 수 없는 사용자 2023. 7. 30. 13:08

https://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

 

문제의 설명을 잘 이해해야 풀 수 있는 문제라고 생각됩니다. 설명에 주사위의 전개도가 주어지는데, 주사위의 방향을 결정하는 명령어에 따라 밑면뿐 아니라 4개의 면이 바뀌기 때문에, 인덱스를 정해놓고 방향에 따라 어떤 인덱스(면)가 어디로 바뀌는지 꼼꼼하게 살펴봐야 할 것 같습니다.

전개도는 다음과 같습니다.

이렇게 되어있을때 만약 밑면이 1이라고 가정하면 6은 윗면이 되고, 2,4,5,3은 옆면이 될 것입니다. 여기서 만약 주사위가 동쪽이나 서쪽으로 구른다면 밑면은 4 혹은 3이 되고 남쪽이나 북쪽으로 구른다면 밑면은 5나 2가 되겠죠. 따라서 구르는 방향에 따라 배열의 인덱스가 어디로 바뀔지 예상하여 case별로 지정해주고 나면 그 뒤에는 해결하기 수월합니다.

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

public class Main {

	//  1
	// 234
	//  5
	//  6
	static int[] dice = new int[7];
	static int n,m,x,y;
	static int[][] map;
	static int[] dx = {1, -1, 0, 0};
	static int[] dy = {0, 0, -1, 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());
		
		y = Integer.parseInt(st.nextToken());
		x = Integer.parseInt(st.nextToken());
		
		int 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 d = Integer.parseInt(st.nextToken());
			move(d);
		}
		
	}
	
	static void move(int d) {
		int nx = x + dx[d-1];
		int ny = y + dy[d-1];
		if(nx <0 || ny < 0 || nx > m-1 || ny > n-1) return;
		roll(d, nx, ny);
		x = nx; y = ny;
		
	}

	// 1 2 3 4 (동 서 남 북)
	static void roll(int d, int x, int y) {
		int tmp = dice[3];
		switch(d) {
		case 1:
			dice[3] = dice[4];
			dice[4] = dice[6];
			dice[6] = dice[2];
			dice[2] = tmp;
			break;
		case 2:
			dice[3] = dice[2];
			dice[2] = dice[6];
			dice[6] = dice[4];
			dice[4] = tmp;
			break;
		case 3:
			dice[3] = dice[5];
			dice[5] = dice[6];
			dice[6] = dice[1];
			dice[1] = tmp;
			break;
		case 4:
			dice[3] = dice[1];
			dice[1] = dice[6];
			dice[6] = dice[5];
			dice[5] = tmp;
			break;
		}
		if(map[y][x] == 0) {
			map[y][x] = dice[6];
		} else {
			dice[6] = map[y][x];
			map[y][x] =0;
		}
		System.out.println(dice[3]);
		
	}
}