반응형
알고리즘 종류
구현
사고 과정
주사위 면의 상태(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 |
시행착오
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 14620 꽃길 (0) | 2021.04.15 |
---|---|
[백준][C++] 2422 한윤정이 이탈리에 가서 아이스트림을 사먹는데 (0) | 2021.04.15 |
[백준][C++] 3190 뱀 (0) | 2021.04.11 |
[백준][C++] 1414 불우이웃돕기 (0) | 2021.04.11 |
[백준][C++] 1368 물대기 (0) | 2021.04.11 |