코딩 공부/백준

[백준][C++] 14499 주사위 굴리기

김 정 환 2021. 4. 11. 17:40
반응형

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

 

 

 

알고리즘 종류

구현

 

 

 

사고 과정

주사위 면의 상태(state)와 값(val)을 나타낼 배열을 각각 생성합니다.

 

1. 명령어에 따라 주사위의 위치를 바꿔줍니다. 만약에 범위 밖으로 나가면 continue로 무시합니다.

 

2. 명령어에 따라 각 주사위 면의 상태를 바꿔줍니다.

 

3. 바닥과 맞닿은 지도의 값이 0인지 아닌지에 따라 처리합니다.

 

4. 주사위 윗 면을 찾아서 값을 출력합니다.

 

 

 

구현(C++)

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
#include <iostream>
#include <vector>
 
using namespace std;
 
int h, w, y, x, k;
 
int mat[21][21];
int val[7]; // 각 면의 값  
char state[7]; // 각 면의 상태  
int dir[5][2= {{0,0}, {0,1}, {0,-1}, {-1,0}, {1,0}}; // right, left, up, down
vector<int> cmd; // 방향 
 
 
bool isValid(int y, int x){
    return (y>=0 && y<h) && (x>=0 && x<w);
}
 
// 주사위 면의 상태 바꾸기  
void change_state(int d){
    
    for(int i=1; i<=6; i++){
        char st = state[i];
        
        if(d==1){
            if(st=='u') state[i]='e';
            else if(st=='n') state[i]='n';
            else if(st=='e') state[i]='d';
            else if(st=='w') state[i]='u';
            else if(st=='s') state[i]='s';
            else if(st=='d') state[i]='w';
            
        }else if(d==2){
            if(st=='u') state[i]='w';
            else if(st=='n') state[i]='n';
            else if(st=='e') state[i]='u';
            else if(st=='w') state[i]='d';
            else if(st=='s') state[i]='s';
            else if(st=='d') state[i]='e';
            
        }else if(d==3){
            if(st=='u') state[i]='n';
            else if(st=='n') state[i]='d';
            else if(st=='e') state[i]='e';
            else if(st=='w') state[i]='w';
            else if(st=='s') state[i]='u';
            else if(st=='d') state[i]='s';
            
        }else if(d==4){
            if(st=='u') state[i]='s';
            else if(st=='n') state[i]='u';
            else if(st=='e') state[i]='e';
            else if(st=='w') state[i]='w';
            else if(st=='s') state[i]='d';
            else if(st=='d') state[i]='n';
            
        }
    }
}
 
 
void solution(){
    
    for(int i=0; i<k; i++){
        int d = cmd[i];
        
        int ny = y + dir[d][0];
        int nx = x + dir[d][1];
        
        if(!isValid(ny, nx)) continue;
        
        change_state(d);
        
        // 면의 값 == 0
        if(mat[ny][nx] == 0){
            for(int i=1; i<=6; i++){
                if(state[i]=='d'){
                    mat[ny][nx] = val[i];
                    break;
                }
            }
        }
        // 면의 값 != 0 
        else{
            for(int i=1; i<=6; i++){
                if(state[i]=='d'){
                    val[i] = mat[ny][nx];
                    mat[ny][nx] = 0;
                    break;
                }
            }
        }
        
        // 맨 위 값 출력  
        for(int i=1; i<=6; i++){
            if(state[i]=='u'){
                cout << val[i] << endl;
                break;
            }
        }
        
        y=ny; x=nx;
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    
    cin >> h >> w >> y >> x >> k;
    
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin >> mat[i][j];
        }
    }
    
    int tmp;
    for(int i=0; i<k; i++){
        cin >> tmp;
        cmd.push_back(tmp);
    }
    
    // 주사위 초기 상태  
    state[1= 'u';
    state[2= 'n';
    state[3= 'e';
    state[4= 'w';
    state[5= 's';
    state[6= 'd';
    
    solution();
}
cs

 

 

 

시행착오

반응형