알고리즘

백준 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;
            }
        }
    }

}

'알고리즘' 카테고리의 다른 글

백준 1197번 최소 스패닝 트리 (JAVA)  (2) 2023.11.19
백준 1531번 투명 (JAVA)  (1) 2023.11.18
백준 13335번 트럭 (JAVA)  (0) 2023.11.16
백준 1202번 보석 도둑 (JAVA)  (0) 2023.11.15
백준 1753번 최단경로 (JAVA)  (1) 2023.11.14