Algorithm

[BOJ] 14999. 주사위 굴리기

프로그래민 2020. 3. 31. 00:05
반응형

문제에 주어진 그대로를 구현하는 시뮬레이션 문제이다.

이 문제에서 관건은 주사위를 굴리면서 위치마다 주어진 값들을 스왑하는 과정이 중요하다. 주사위를 
    0
1  2  3
   4
   5
위와 같은식으로 인덱싱을 하였고, 2번 인덱스를 top, 5번 인덱스를 bottom으로 생각하고 문제를 접근하였다. 그리고 각 각 방향마다 함수를 두어 스왑하는 과정을 통해 문제를 해결하였다. 그리고 문제를 읽는 과정에서 위쪽과 아래쪽을 헷갈리지 않고 방향을 주어야하는 점도 중요하다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package selfStudy.chap07;
 
 
public class Main_bj_14499_주사위굴리기 {
    
    static int N,M;
    static int x,y;
    static int[][] map;
    static int[] di = {0,0,0,-1,1};     //0,동,서,남,북
    static int[] dj = {0,1,-1,0,0};     //0,동,서,남,북
    static int[] dice= {0,0,0,0,0,0};
    /*
     *   0
     * 1 2 3        //5번위치가바닥, 2번위치가 탑으로 생각하고 접근
     *   4
     *   5
     */
    static int T;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        
        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());
        T=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 tc=0;tc<T;tc++) {
            int move=Integer.parseInt(st.nextToken());
            
            int nextX=x+di[move]; int nextY=y+dj[move];
            
            if(nextX<0 || nextX>=|| nextY<0 || nextY>=M)
                continue;
            
            x=nextX;y=nextY;    //갱신
            
            if(move==1
                turnRight();
            else if(move==2)
                turnLeft();
            else if(move==3)
                turnUp();
            else if(move==4)
                turnDown();
            
            if(map[nextX][nextY]==0) {
                map[nextX][nextY]=dice[5];
            }else {
                dice[5]=map[nextX][nextY];
                map[nextX][nextY]=0;
            }
            System.out.println(dice[2]);
            
        }
    }
    
    static void turnRight() {
        int temp = dice[2];
        dice[2]=dice[1];
        dice[1]=dice[5];
        dice[5]=dice[3];
        dice[3]=temp;
        /*
         *   0
         * 5 1 2
         *   4
         *   3
         */
    }
    static void turnLeft() {
        int temp = dice[2];
        dice[2]=dice[3];
        dice[3]=dice[5];
        dice[5]=dice[1];
        dice[1]=temp;
        /*
         *   0
         * 2 3 5
         *   4
         *   1
         */
    }
    static void turnUp() {
        int temp=dice[2];
        dice[2]=dice[4];
        dice[4]=dice[5];
        dice[5]=dice[0];
        dice[0]=temp;
        /*
         *   2
         * 1 4 3
         *   5
         *   0
         */
    }
    static void turnDown() {
        int temp=dice[2];
        dice[2]=dice[0];
        dice[0]=dice[5];
        dice[5]=dice[4];
        dice[4]=temp;
        /*
         *   5
         * 1 0 3
         *   2
         *   4
         */
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
                                                  
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 14891. 톱니바퀴  (0) 2020.03.31
[BOJ] 13335. 트럭  (0) 2020.03.31
[BOJ] 5427. 불  (0) 2020.03.30
[BOJ] 1182. 부분수열의 합  (0) 2020.03.30
[BOJ] 1707. 이분 그래프  (0) 2020.03.29