본문 바로가기

ALGORITHM

백준 14499 주사위 굴리기 (Java)

1. 문제 링크

 

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. 문제 및 입출력예제

 

3. 문제 풀이

주사위 6면을 한 번에 다루면서 숫자를 옮겼다. 주사위가 떨어지는 1 2 3 4 방향에 따라 주사위 6면 전부를 움직였다.

  1. 주사위 배열은 상단, 하단, 동, 서, 남, 북 순으로 조작했다.
  2. 입력받은 명령에 따라 주사위에서 바꾸는 4부분의 값의 바꿨다.
  3. 도착한 바닥이 0이면 바닥에 주사위 하단의 숫자를 바닥에 넣는다.
  4. 도착한 바닥이 숫자라면 주사위 하단에 해당 숫자를 저장하고 바닥을 0으로 만든다.
  5. 바뀐 위치로 반복문을 돈다.

 

4. 코드

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int[] dx = {0,0,-1,1};
		int[] dy = {1,-1,0,0};
		String[] split = br.readLine().split(" ");
		int N = Integer.parseInt(split[0]);
		int M = Integer.parseInt(split[1]);
		int x = Integer.parseInt(split[2]);
		int y = Integer.parseInt(split[3]);
		int K = Integer.parseInt(split[4]);
		int[][] map = new int[N][M];
		for(int i=0;i<N;i++) {
			split = br.readLine().split(" ");
			for(int j=0;j<M;j++) {
				map[i][j] = Integer.parseInt(split[j]);
			}
		}
		split = br.readLine().split(" ");
		int[] dice = {0, 0, 0, 0, 0, 0}; //위, 아래, 동, 서, 남, 북
		int temp;
		for(int i=0;i<K;i++) {
			int command = Integer.parseInt(split[i])-1;
			int X = x + dx[command];
			int Y = y + dy[command];
			if(X<0 || X>=N || Y<0 || Y>=M) continue;
			
			switch(command) {
				case 0: //동
					//위 0 -> 동2 -> 아래1 -> 서3 -> 위0
 					temp = dice[0];
					dice[0] = dice[3];
					dice[3] = dice[1];
					dice[1] = dice[2];
					dice[2] = temp;
					break;
				case 1: //서
					//위 0 -> 서3 -> 아래1 -> 동2 -> 위0
					temp = dice[0];
					dice[0] = dice[2];
					dice[2] = dice[1];
					dice[1] = dice[3];
					dice[3] = temp;					
					break;
				case 2: //북
					//위0 -> 북5 -> 아래1 -> 남4 -> 위0
					temp = dice[0];
					dice[0] = dice[4];
					dice[4] = dice[1];
					dice[1] = dice[5];
					dice[5] = temp;
					break;
				case 3: //남
					//위0 -> 남4 -> 아래1 -> 북5 -> 위0
					temp = dice[0];
					dice[0] = dice[5];
					dice[5] = dice[1];
					dice[1] = dice[4];
					dice[4] = temp;
					break;
				}
			
			int floor = map[X][Y]; //바닥면에 있는 글자
			if(floor == 0) { //바닥이 0이면
				map[X][Y] = dice[1];
			}
			else { //바닥에 글자가 있으면 
				dice[1] = floor;
				map[X][Y] = 0;
			}
			x = X;
			y = Y;
			sb.append(dice[0]).append("\n");
		}
		System.out.println(sb);
	}

}

 

'ALGORITHM' 카테고리의 다른 글

백준 3055 탈출 (Java)  (0) 2023.05.08
백준 1600 말이 되고픈 원숭이 (Java)  (1) 2023.05.07
백준 1012 유기농 배추 (Java)  (0) 2023.05.05
백준 1331 나이트 투어 (Java)  (0) 2023.05.04
백준 7562 나이트의 이동 (Java)  (0) 2023.05.04