본문 바로가기

코딩테스트

[Gold4-JAVA] 백준 14499 - 주사위 굴리기

728x90

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

 

🤔 문제 풀이

쉽지 않았던 시뮬레이션/구현 문제였다.

주사위를 굴렸을 때 map과 닿는 각 면의 숫자를 어떻게 채워줄지 막막했었다.

 

 

주사위가 다음과 같이 있다고 하고, 윗면을 보이는 주사위가 3이라고 한다면 다음과 같은 방식으로 움직이게 된다.

동쪽이동 서쪽이동 북쪽이동 남쪽이동
2 -> 3 4 -> 3 5 -> 3 1 -> 3
6 -> 2 6 -> 4 6 -> 5 6 -> 1
4 -> 6 2 -> 6 1 -> 6 5 -> 6
3 -> 4 3 -> 2 3 -> 1 3 -> 5

 

이 규칙을 이용하여 다음과 같은 로직으로 풀었다.

 

1. 다음 좌표가 map을 벗어나는지 검사하고

2. 벗어나지 않는다면 주사위 각 면의 숫자들을 다음 면으로 이동시킨 뒤

3. map[x][y] 좌표가 0이라면 주사위 면의 숫자를 map[x][y]로, 아니라면 map[x][y]를 주사위 아랫면인 d[6]으로 저장한다.

4. 주사위의 윗 면인 d[3]을 출력한다.

 

🚨CODE

import java.util.*;
import java.io.*;
import java.math.BigInteger;

public class Main {
	static int[][] map;
	static int[] d;
	static int[] dx = {0,0,0,-1,1}; // 1=동, 2=서, 3=북, 4=남
	static int[] dy = {0,1,-1,0,0};
	static int x,y,n,m;
	static StringBuilder sb = new StringBuilder();
	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());
		map = new int[n][m];
		d = new int[7];
		
		x = Integer.parseInt(st.nextToken());
		y = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
	
		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 direct = Integer.parseInt(st.nextToken());
			move(direct);
		}
		System.out.println(sb);
	}
	public static void move(int direct) {
		int nextX = x+dx[direct];
		int nextY = y+dy[direct];
		
		if(nextX < 0 || nextY < 0 || nextX >= n || nextY >= m)
			return;
		
		changeTop(direct, nextX, nextY);
		x = nextX; y = nextY;
	}
	public static void changeTop(int direct, int x, int y) {
		int temp = d[3]; // 주사위 윗면
		
		// 이동 방향이 동쪽이라면
		if(direct == 1) {
			d[3] = d[2];
			d[2] = d[6];
			d[6] = d[4];
			d[4] = temp;
		} // 서쪽이라면
		else if(direct == 2) {
			d[3] = d[4];
			d[4] = d[6];
			d[6] = d[2];
			d[2] = temp;
		} // 북쪽이라면
		else if(direct == 3) {
			d[3] = d[5];
			d[5] = d[6];
			d[6] = d[1];
			d[1] = temp;
		} // 남쪽이라면
		else if(direct == 4) {
			d[3] = d[1];
			d[1] = d[6];
			d[6] = d[5];
			d[5] = temp;
		}
		if(map[x][y] == 0)
			map[x][y] = d[6];
		else {
			d[6] = map[x][y];
			map[x][y] = 0;
		}
		sb.append(d[3]).append("\n");
	}
}
728x90
반응형