알고리즘/알고리즘문풀

BOJ - 주사위 굴리기 14499번 (JAVA)

developer-ellen 2022. 4. 11. 13:28

❓ 문제 - 백준 주사위 굴리기 14499번 - JAVA 풀이법

출처 

(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

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다.

  • 주사위의 윗면 - 바닥면 - 앞면 - 뒷면 - 왼쪽면 - 오른쪽면에 대한 값들을 dice 배열을 통해 저장
  • 지도의 값을  map를 통해 저장한다.
  • 주사위를 움직일 때 dx, dy(동-0, 서-1, 북-2, 남-3)를 이용해서 움직이려는 곳이 지도 밖이면 움직이지 않게 한다.
  • 주사위를 움직일 때 동,서,북,남 방향에 맞춰서 move_right(), move_left(), move_up(), move_down() 함수를 호출하여 주사위를 해당 방향으로 움직인다.
  • 만약 움직였을 때 해당 지도의 값이 0이면 주사위의 바닥면(dice[1])의 값을 지도에 복사한다.
  • 만약 움직였을 때 해당 지도의 값이 0이 아니면 바닥면(dice[1])에 지도의 값을 복사한 후 지도 값을 0으로 변경한다.

2. 주사위 굴림 구현

  • move_right() : 주사위 동쪽으로 굴리면 주사위의 값들이 윗 -> 오 -> 바닥 -> 왼 -> 윗 으로 이동하는 것을 구현한다.
  • move_left() : 주사위 서쪽으로 굴리면 주사위의 값들이 윗 -> 왼 -> 바 -> 오 -> 윗 으로 이동하는 것을 구현한다.
  • move_up() : 주사위 북쪽으로 굴리면 주사위의 값들이 윗 -> 뒷 -> 바 -> 앞 -> 윗 으로 이동하는 것을 구현한다.
  • move_down() : 주사위 남쪽으로 굴리면 주사위의 값들이 윗 -> 앞 -> 바 -> 뒷 -> 윗 으로 이동하는 것을 구현한다.

3. 느낀점

  • 저번에 풀었던 파이썬 방식과 유사하게 빡구현으로 이동 방향에 맞춰 다 구현해줬다.
  • 혹시나 다른 사람들의 풀이를 참고했지만 다 이런식으로 구현하신듯하다...!

 

 

💻 소스코드

// BOJ - 주사위 굴리기(14499번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_14499 {
	public static int n, m, x, y, k;
	public static int[][] map;
	// 동, 서, 북, 남
	public static int[] dx = {0, 0, -1, 1};
	public static int[] dy = {1, -1, 0, 0};
	// 윗면, 바닥면, 앞면, 뒷면, 왼쪽면, 오른쪽면
	public static int[] dice = {0, 0, 0, 0, 0, 0};
	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(), " ");
		for(int i=0;i<k;i++) {
			int move = Integer.parseInt(st.nextToken()) - 1;
			x += dx[move];
			y += dy[move];
			if(x < 0 || x >= n || y < 0 || y >= m) {
				x -= dx[move];
				y -= dy[move];
				continue;
			}

			switch(move) {
			case 0:
				move_right();
				break;
			case 1:
				move_left();
				break;
			case 2:
				move_up();
				break;
			case 3:
				move_down();
				break;
			}
			// 바닥면 복사
			if(map[x][y] == 0) {
				map[x][y] = dice[1];
			} else {
				dice[1] = map[x][y];
				map[x][y] = 0;
			}
			
			System.out.println(dice[0]);
		}
		
	
	}
	
	public static void move_right() {
		// 윗 -> 오 -> 바닥 -> 왼 -> 윗
		int temp = dice[0];
		dice[0] = dice[4];
		dice[4] = dice[1];
		dice[1] = dice[5];
		dice[5] = temp;
		
	}
	
	public static void move_left() {
		// 윗 -> 왼 -> 바 -> 오 -> 윗
		int temp = dice[0];
		dice[0] = dice[5];
		dice[5] = dice[1];
		dice[1] = dice[4];
		dice[4] = temp;
		
	}
	
	public static void move_up() {
		// 윗 -> 뒷 -> 바 -> 앞 -> 윗
		int temp = dice[0];
		dice[0] = dice[2];
		dice[2] = dice[1];
		dice[1] = dice[3];
		dice[3] = temp;
		
	}
	
	public static void move_down() {
		// 윗 -> 앞 -> 바 -> 뒷 -> 윗
		int temp = dice[0];
		dice[0] = dice[3];
		dice[3] = dice[1];
		dice[1] = dice[2];
		dice[2] = temp;
		
	}

}