본문 바로가기

알고리즘

[C] 주사위 굴리기

백준 14499번

 

오랜만에 머리속에서 공간 돌려봤던 문제

중고등학교 시절에 수학문제 풀던 기분이었다ㅋㅋㅋ

 

주사위 굴리는 로직만 파악하면 까다롭지는 않았던 문제다

동서남북 각각 손으로 그려보며 각 방향별로 주사위 어느 위치에 있던 숫자가 어디로 가는지를 파악했다

나머지는 문제에서 하라는 그대로 숫자를 복사하고 출력만했다

디버깅 안하면서 풀었는데 바로 맞춰서 뿌듯

 

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
127
128
129
130
131
132
133
134
135
136
137
138
#include <stdio.h>
 
int map[25][25];
int N,M,x,y;
 
int dx[5= {0,0,0,-1,1};
int dy[5= {0,1,-1,0,0};
 
// orig
//   2
// 4 1 3    
//   5
//   6
 
// east
//   2
// 6 4 1    
//   5
//   3        1 -> 4, 3 -> 1, 4 -> 6, 6 -> 3
 
// west
//   2
// 1 3 6     
//   5
//   4        1 -> 3, 3 -> 6, 4 -> 1, 6 -> 4
 
// north
//   6
// 4 2 3    
//   1
//   5        1 -> 2, 2 -> 6, 5 -> 1, 6 -> 5
 
// south
//   1
// 4 5 3    
//   6
//   2        1 -> 5, 2 -> 1, 5 -> 6, 6 -> 2
 
// 1 : upper
// 6 : lower
 
typedef struct Dice{
    int numbers[7= {0,};
}Dice;
 
Dice dice;
 
void printMap(){
    for(int i = 0 ; i < N ; i++){
        for(int j = 0 ; j < M ; j++printf("%d ",map[i][j]);
        printf("\n");
    }
    printf("\n");
}
void printDice(){
    printf("  %d\n",dice.numbers[2]);
    printf("%d %d %d\n",dice.numbers[4], dice.numbers[1], dice.numbers[3]);
    printf("  %d\n",dice.numbers[5]);
    printf("  %d\n",dice.numbers[6]);
    printf("\n");
}
// 1 : east, 2 : west, 3 : north , 4 : south
void moveDice(int dir){
    int next_x = x + dx[dir];
    int next_y = y + dy[dir];
    // printf("pos : %d %d\n\n",next_x,next_y);
 
    // out of range
    if(next_x<0 || next_y<0 || next_x>=|| next_y>=M) return;
    
    // printMap();
    // printDice();
 
    Dice next_dice;
    switch (dir)
    {
        // east
        case 1:
            next_dice.numbers[1= dice.numbers[4];
            next_dice.numbers[2= dice.numbers[2];
            next_dice.numbers[3= dice.numbers[1];
            next_dice.numbers[4= dice.numbers[6];
            next_dice.numbers[5= dice.numbers[5];
            next_dice.numbers[6= dice.numbers[3];
            break;
        // west
        case 2:
            next_dice.numbers[1= dice.numbers[3];
            next_dice.numbers[2= dice.numbers[2];
            next_dice.numbers[3= dice.numbers[6];
            next_dice.numbers[4= dice.numbers[1];
            next_dice.numbers[5= dice.numbers[5];
            next_dice.numbers[6= dice.numbers[4];
            break;
        // north
        case 3:
            next_dice.numbers[1= dice.numbers[2];
            next_dice.numbers[2= dice.numbers[6];
            next_dice.numbers[3= dice.numbers[3];
            next_dice.numbers[4= dice.numbers[4];
            next_dice.numbers[5= dice.numbers[1];
            next_dice.numbers[6= dice.numbers[5];
            break;
        // south
        case 4:
            next_dice.numbers[1= dice.numbers[5];
            next_dice.numbers[2= dice.numbers[1];
            next_dice.numbers[3= dice.numbers[3];
            next_dice.numbers[4= dice.numbers[4];
            next_dice.numbers[5= dice.numbers[6];
            next_dice.numbers[6= dice.numbers[2];
            break;
    }
    if(map[next_x][next_y]==0){
        map[next_x][next_y] = next_dice.numbers[6];
    }else{
        next_dice.numbers[6= map[next_x][next_y];
        map[next_x][next_y] = 0;
    }
    dice = next_dice;
    x = next_x;
    y = next_y;
 
    printf("%d\n",dice.numbers[1]);
}
 
int main(){
    int K;
    scanf("%d %d %d %d %d",&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 t = 1; t <= K ; t++){
        int cmd;
        scanf("%d",&cmd);
        moveDice(cmd);
    }
}
cs

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

[C++] 프로그래머스 전화번호 목록  (0) 2021.04.07
[C++] 연산자 끼워넣기  (0) 2021.03.31
[C] 컨베이어 벨트 위의 로봇  (0) 2021.03.25
[C] 사다리 조작  (0) 2021.03.25
[C] 게리맨더링 2  (0) 2021.03.24