알고리즘

백준 14499번 주사위 굴리기 (JAVA)

박카스마시며코딩 2023. 11. 17. 22:59

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

 

저는 구현을 통해 문제를 해결하였습니다.

저는 주사위를 4x3배열로 표현하였고, 주사위가 움직일때 마다, 그 방향으로 배열을 움직여 문제를 해결하였습니다.

 

package BOJ.simulation;

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

public class BOJ_1449 {
    private static final int[] DY = {0,0,-1,1};
    private static final int[] DX = {1,-1,0,0};
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int y = Integer.parseInt(st.nextToken());
        int x = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int[][] 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());
        int[] command = new int[k];
        for(int i = 0 ; i < k ; i++){
            command[i] = Integer.parseInt(st.nextToken()) - 1;
        }
        cal(y,x,map,n,m,command,k);
//        int[][] dice = new int[][]{
//            {0,1,0},
//            {2,3,4},
//            {0,5,0},
//            {0,6,0}
//        };
//        moveDice(dice,0);
//        printDice(dice);
    }

    private static void printDice(int[][] dice) {
        for(int i = 0 ; i < 4 ; i++){
            for(int j = 0 ; j < 3 ; j++){
                System.out.print(dice[i][j]);
            }
            System.out.println();
        }
    }


    private static void cal(int y, int x, int[][] map, int n, int m, int[] command, int k) {
        int[][] dice = new int[4][3];
        for(int dir : command){
            y += DY[dir];
            x += DX[dir];
            if(y < 0 || y >= n || x < 0 || x >= m){ // 바깥으로 이동하려할 때 무시
                y -= DY[dir];
                x -= DX[dir];
                continue;
            }
            moveDice(dice,dir);
            if(map[y][x] == 0){
                map[y][x] = dice[1][1];
            }else{
                dice[1][1] = map[y][x];
                map[y][x] = 0;
            }
            System.out.println(dice[3][1]);
        }
    }
    private static void moveDice(int[][] dice, int dir){
        if(dir == 2 || dir == 3){
            int nowIndex = 0;
            int prev = dice[nowIndex][1];
            for(int i = 0 ; i < 4 ; i++){
                int nextIndex = (nowIndex - DY[dir] + 4) % 4;
                int temp = dice[nextIndex][1];
                dice[nextIndex][1] = prev;
                prev = temp;
                nowIndex = nextIndex;
            }
        }else{
            int nowIndex = 0;
            int prev = dice[1][nowIndex];
            for(int i = 0 ; i < 4 ; i++){
                int nextIndex = (nowIndex - DX[dir] + 4) % 4;
                if(nextIndex == -1 || nextIndex == 3){
                    int temp = dice[3][1];
                    dice[3][1] = prev;
                    prev = temp;
                    nowIndex = nextIndex;
                    continue;
                }
                if(nextIndex == -2){
                    nextIndex = 2;
                }
                if(nextIndex == 4){
                    nextIndex = 0;
                }
                int temp = dice[1][nextIndex];
                dice[1][nextIndex] = prev;
                prev = temp;
                nowIndex = nextIndex;
            }
        }
    }

}