Coding Test
<C/C++> BOJ 14499: 주사위 굴리기
Deviloper😈
2022. 3. 30. 21:38
https://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
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define MAXN 20
#define MAXN2 1000
int dice[4][3] = { 0, };// 주사위면에 적혀있는 숫자
static int dr[] = { 0, 0, 0, -1, 1 };
static int dc[] = { 0, 1, -1, 0, 0 };
int N, M, dice_r, dice_c, K;
int map[MAXN + 5][MAXN + 5];
int cmd[MAXN2 + 5];
void Input(void) {
cin >> N >> M >> dice_r >> dice_c >> K; // =================실수: dice_c >> dice_r
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < K; i++) {
cin >> cmd[i];
}
}
void moveDice(int i) {
int t;
switch (i) {
case 1:
t = dice[1][0];
dice[1][0] = dice[3][1];
dice[3][1] = dice[1][2];
dice[1][2] = dice[1][1];
dice[1][1] = t;
break;
case 2:
t = dice[1][0];
dice[1][0] = dice[1][1];
dice[1][1] = dice[1][2];
dice[1][2] = dice[3][1];
dice[3][1] = t;
break;
case 3:
t = dice[0][1];
dice[0][1] = dice[1][1];
dice[1][1] = dice[2][1];
dice[2][1] = dice[3][1];
dice[3][1] = t;
break;
case 4:
t = dice[0][1];
dice[0][1] = dice[3][1];
dice[3][1] = dice[2][1];
dice[2][1] = dice[1][1];
dice[1][1] = t;
break;
}
}
void Solve(void) {
for (int i = 0; i < K; i++) {
int dir = cmd[i];
dice_r += dr[dir], dice_c += dc[dir]; // 주사위 위치 변경
if (dice_r < 0 || dice_r >= N || dice_c < 0 || dice_c >= M) { // 범위 밖
dice_r -= dr[dir], dice_c -= dc[dir];
continue;
}
moveDice(dir);
if (map[dice_r][dice_c]) { // 0이 아닌 숫자라면
dice[3][1] = map[dice_r][dice_c]; // 칸 숫자를 주사위에 복사
map[dice_r][dice_c] = 0; // 칸에 있는 숫자 삭제
}
else { //0인 숫자라면
map[dice_r][dice_c] = dice[3][1]; // =================실수: 주사위를 칸숫자에 복사
}
cout << dice[1][1] << endl;
}
}
int main(void) {
Input();
Solve();
//for (int i = 0; i < 4; i++) {
// for (int j = 0; j < 3; j++) {
// printf("%d ", dice[i][j]);
// }
// printf("\n");
//}
return 0;
}
- 적어도 두 개 이상 손으로 직접 풀어보면서 문제 뜻 정확히 파악하기
"주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며,"
여기서 지도 위에 윗 면을 지도와 붙어있는 면이라고 생각함.
하지만 top 을 뜻하는 거였음. - map이 0인 경우와 아닌 경우 from to 정확하게 생각하기
- 왜 x, y를 세로, 가로라고 해놓은 것인가...!!
꼼꼼히 읽자. 실수도 실력