Be a developer

백준 14499 주사위 굴리기 본문

카테고리 없음

백준 14499 주사위 굴리기

중국고대사 2019. 4. 15. 16:44

삼성 코딩 테스트를 치고 와서 다시 마음을 다잡고 알고리즘을 공부하기 시작했다.

하루에 2문제 이상 꼭 꾸준히 푸는 것을 목표로 해야 겠다.

시뮬레이션 문제는 조건에 따라 풀기만 하면 되지만, c++ 숙련도를 높이는 좋은 방법이라고 생각한다.

 

이번 문제도 시뮬레이션 문제로서, 문제를 잘 이해하고 그에 맞춰 코딩을 하면 된다. 

하지만 항상 그렇듯이 바로 코딩을 시작하지 않고, 먼저 생각을 한 후 코딩을 시작했다.

 

문제를 푸는 핵심은 방향에 따라서 이동하는 코드를 쉽게 하도록 dr, dc 배열을 두는 것이 하나 있다.(dr, dc의 인덱스를 문제에 주어진 방향과 맞추면 더 편하다.)

다음으로 주사위를 돌릴 때, 주사위의 값들을 이어서 바꿔주는 것이다. 4가지 방향이 있으므로, 각각 함수를 만들어 주어서, 코드를 조금 보기 쉽게 해주었다.

 

아래는 코드이다.

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
#include <iostream>
using namespace std;
 
int n, m, x, y, k;
int map[20][20];
int ju[6];
 
//동:1, 서:2, 북:3, 남:4 이기 때문에 그 순서대로 세팅
int dr[4= { 0,0,-1,1 };
int dc[4= { 1,-1,0,0 };
 
void right() {
    int temp = ju[3];
    ju[3= ju[0]; ju[0= ju[2]; ju[2= ju[1]; ju[1= temp;
}
 
void left() {
    int temp = ju[3];
    ju[3= ju[1]; ju[1= ju[2]; ju[2= ju[0]; ju[0= temp;
}
 
void up() {
    int temp = ju[4];
    ju[4= ju[1]; ju[1= ju[5]; ju[5= ju[0]; ju[0= temp;
}
 
void down() {
    int temp = ju[5];
    ju[5= ju[1]; ju[1= ju[4]; ju[4= ju[0]; ju[0= temp;
}
 
int main() {
    cin >> n >> m >> x >> y >> k;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&map[i][j]);
        }
    }
 
    for (int i = 0; i < k; i++) {
        int dir;
        scanf("%d"&dir);
 
        int nr = x + dr[dir - 1];
        int nc = y + dc[dir - 1];
 
        if (nc < 0 || nc >= m || nr < 0 || nr >= n)continue;
        
        switch (dir) {
                //동
            case 1:
                right();
                break;
                //서
            case 2:
                left();
                break;
                //북
            case 3:
                up();
                break;
                //남
            case 4:
                down();
        }
 
        if (map[nr][nc] == 0) {
            map[nr][nc] = ju[1];
        }
        else {
            ju[1= map[nr][nc];
            map[nr][nc] = 0;
        }
        /*출력(디버깅)
        printf("\n%d번 째\n",i+1);
        for (int j = 0; j < 6; j++) {
            printf("%d ", ju[j]);
        }
        printf("\n");
        */
        x = nr;
        y = nc;
        printf("%d\n", ju[0]);
    }
 
    return 0;
}
cs
Comments