백준/구현

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

믕비 2023. 9. 8. 08:42
반응형

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

package com.ssafy.algoStudy.BJ;

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

/**
 * N*M인 지도. 오른쪽이 동쪽 위쪽이 북쪽.
 * 	 2
 * 4 1 3
 * 	 5
 * 	 6  
 * 놓여져 있는 곳의 좌표 (x, y)
 * 가장 처음에 주사위에는 모든 면에 0이 적혀져 있음.
 * 지도의 각 칸에는 정수가 쓰여 있고 주사위를 굴렸을 때
 * 1. 이동한 칸에 있는 수가 0이면 - 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
 * 2. 이동한 칸에 있는 수가 0이 아니면 - 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며 칸의 수가 0이 된다.
 * 주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위 이동 때마다 상단에 쓰여 있는 값을 구하자.
 * 주사위는 지도 바깥으로 이동할 수 없다.
 * @author SSAFY
 *
 */
public class Main_14499_주사위굴리기 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static int N, M, x, y, K;
	static int[][] map;
	//바닥, 위, 앞, 뒤, 오른, 왼
	static int dice[] = new int[6];
	
	public static void main(String[] args) throws IOException{
		/**
		 * [입력]
		 * 1. 지도의 세로 크기 N, 가로 크기 M (1 <= N,M <= 20), 주사위를 놓은 곳의 좌표 x, y(0 <= x <= N-1, 0 <= y <= M-1), 명령의 개수 K(1 <= K <= 1,000)
		 * *주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 
		 * 2~N. 그래프식으로 입력
		 * (동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4)
		 */
		init();
		/**
		 * [출력]
		 * 이동 때마다 주사위의 뮛 면에 쓰여 있는 수를 출력.
		 * *바깥으로 이동하는 경우 해당 명령 무시, 출력하면 안됨.
		 */
		System.out.println(sb);
	}
	
	static void init() throws IOException{
		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 n = 0; n < N; n++) {
			st = new StringTokenizer(br.readLine());
			for(int m = 0; m < M; m++) {
				map[n][m] = Integer.parseInt(st.nextToken());
			}
		}
		
		st = new StringTokenizer(br.readLine());
		while(st.hasMoreTokens()) {
			moveDice(Integer.parseInt(st.nextToken()));
		}
	}
	
	static void moveDice(int dir) {
		switch(dir) {
		//동
		case(1):
			//굴린 후의 위치가 범위를 벗어나면 return
			y += 1;
			if(y >= M) {
				y--;
				return;
			}
			//아니면 주사위 위치의 숫자들 바꿔줌
			east();
			//이동 위치에 숫자가 0이면 주사위 바닥의 숫자를 지도에 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[0];
			}
			//0이 아니면 지도 숫자가 주사위 바닥에 복사, 지도 숫자는 0으로 바뀜
			else {
				dice[0] = map[x][y];
				map[x][y] = 0;
			}
			sb.append(dice[1]).append('\n');
			break;
		//서
		case(2):
			//굴린 후의 위치가 범위를 벗어나면 return
			y -= 1;
			if(y < 0) {
				y++;
				return;
			}
			//아니면 주사위 위치의 숫자들 바꿔줌
			west();
			//이동 위치에 숫자가 0이면 주사위 바닥의 숫자를 지도에 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[0];
			}
			//0이 아니면 지도 숫자가 주사위 바닥에 복사, 지도 숫자는 0으로 바뀜
			else {
				dice[0] = map[x][y];
				map[x][y] = 0;
			}
			sb.append(dice[1]).append('\n');
			break;
		//북
		case(3):
			//굴린 후의 위치가 범위를 벗어나면 return
			x -= 1;
			if(x < 0) {
				x++;
				return;
			}
			//아니면 주사위 위치의 숫자들 바꿔줌
			north();
			//이동 위치에 숫자가 0이면 주사위 바닥의 숫자를 지도에 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[0];
			}
			//0이 아니면 지도 숫자가 주사위 바닥에 복사, 지도 숫자는 0으로 바뀜
			else {
				dice[0] = map[x][y];
				map[x][y] = 0;
			}
			sb.append(dice[1]).append('\n');
			break;
		//남
		case(4):
			//굴린 후의 위치가 범위를 벗어나면 return
			x += 1;
			if(x >= N) {
				x--;
				return;
			}
			//아니면 주사위 위치의 숫자들 바꿔줌
			south();
			//이동 위치에 숫자가 0이면 주사위 바닥의 숫자를 지도에 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[0];
			}
			//0이 아니면 지도 숫자가 주사위 바닥에 복사, 지도 숫자는 0으로 바뀜
			else {
				dice[0] = map[x][y];
				map[x][y] = 0;
			}
			sb.append(dice[1]).append('\n');
			break;
		}
	}
	
	static void south() {
		//바닥, 위, 앞, 뒤, 오른, 왼
		int temp = dice[0];
		//바닥 <- 앞
		dice[0] = dice[2];
		//앞 <- 위
		dice[2] = dice[1];
		//위 <- 뒤
		dice[1] = dice[3];
		//뒤 <- 바닥
		dice[3] = temp;
	}
	
	static void north() {
		//바닥, 위, 앞, 뒤, 오른, 왼
		int temp = dice[0];
		//바닥 <- 뒤
		dice[0] = dice[3];
		//뒤 <- 위
		dice[3] = dice[1];
		//위 <- 앞
		dice[1] = dice[2];
		//앞 <- 바닥
		dice[2] = temp;
	}
	
	static void east() {
		//바닥, 위, 앞, 뒤, 오른, 왼
		int temp = dice[0];
		//바닥 <- 오른
		dice[0] = dice[4];
		//오른 <- 위
		dice[4] = dice[1];
		//위 <- 왼
		dice[1] = dice[5];
		//왼 <- 바닥
		dice[5] = temp;
	}
	
	static void west() {
		//바닥, 위, 앞, 뒤, 오른, 왼
		int temp = dice[0];
		//바닥 <- 왼
		dice[0] = dice[5];
		//왼 <- 위
		dice[5] = dice[1];
		//위 <- 오
		dice[1] = dice[4];
		//오 <- 바닥
		dice[4] = temp;
	}
}
반응형

'백준 > 구현' 카테고리의 다른 글

[백준] 1700 : 멀티탭 스케줄링 (JAVA)  (1) 2024.10.03
[백준] 1202 : 보석도둑 (JAVA)  (0) 2024.10.03
[백준] 15961 : 회전초밥 (JAVA)  (2) 2024.09.27
[백준] 5430 : AC (JAVA)  (1) 2024.09.26
[백준] 30023 : 전구 상태 바꾸기  (0) 2024.09.02