이 문제의 가장 큰 관건은, 주사위 시뮬레이션이다.
그리고 어떻게 주사위를 표현할까? 라는 고민을 해결하지 못해서, 풀이를 검색해봤다.
접근이 달랐다.
주사위 자체를 어떻게 표현하여 규칙성 있게 움직이느냐를 고찰하기보다
회전을 했을때, 어떻게 변하느냐 만 생각하면 됐다.
서쪽으로 이동했을때 전개도면이 어떻게 변하는지
동쪽으로 이동했을때 전개도면이 어떻게 변하는지
북쪽으로 이동했을때 전개도면이 어떻게 변하는지
남쪽으로 이동했을때 전개도면이 어떻게 변하는지
이 '어떻게 변하는지'에 관점을 두면 풀 수 있었다.
그림을 그려주신 분이 계셔서, 해당 블로그를 올려놓는다.
#include <iostream>
#include <vector>
using namespace std;
int N, M, K, sX, sY;
int MAP[20][20];
// 동 서 북 남 = 문제에서 1 2 3 4
int mx[4] = {0, 0, -1, 1};
int my[4] = {1, -1, 0, 0};
vector<int> dice;
void rollEAST() {
dice = {dice[3], dice[1], dice[0], dice[5], dice[4], dice[2]};
}
void rollWEST() {
dice = {dice[2], dice[1], dice[5], dice[0], dice[4], dice[3]};
}
void rollNORTH() {
dice = {dice[4], dice[0], dice[2], dice[3], dice[5], dice[1]};
}
void rollSOUTH() {
dice = {dice[1], dice[5], dice[2], dice[3], dice[0], dice[4]};
}
int main() {
for(int i = 0 ; i < 6; i++)
dice.push_back(0);
cin >> N >> M >> sX >> sY >> K;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> MAP[i][j];
}
}
int I;
while(K--) {
cin >> I;
// 배열은 0-base, 입력은 1-base
int tx = sX + mx[I - 1];
int ty = sY + my[I - 1];
if(tx < 0 || tx >= N || ty < 0 || ty >= M)
continue;
switch(I) {
case 1: // 동
rollEAST();
break;
case 2: // 서
rollWEST();
break;
case 3: // 북
rollNORTH();
break;
case 4: // 남
rollSOUTH();
break;
}
if(MAP[tx][ty] == 0) {
// 주사위 바닥면에 있는 수가, 칸에 복사됨
MAP[tx][ty] = dice[0];
} else {
// 칸에 쓰여진 수가 주사위 바닥면으로 복사
// 그리고 칸은 0으로
dice[0] = MAP[tx][ty];
MAP[tx][ty] = 0;
}
sX = tx;
sY = ty;
cout << dice[5] << "\n";
}
}
소요 시간 : 1시간 30분
다시 풀이를 시도했다.
역시나 나는, '이 주사위를 배열로 어떻게 표현하지?' 라는 틀에 박혀 거기서만 생각을 하게 되었던 것 같다.
뭔가 코테 문제를 풀면 풀수록 이렇게 정형화된 답안을 좇게 되면서 자동적으로 배열로 구현해야겠다고 생각하고 거기서부터 늪에 빠지는 것 같다.
배열로 표현할 필요가 없다. 전개도의 숫자 표현 방식이 어떻게 변하느냐 만 생각하면 된다.
이걸 생각하냐 못하냐의 차이가 문제의 핵심이 아닌가 싶다.
문제의 자체에 대한 이해력도 이에 한몫 하는 것 같다.
'문제를 얼마나 잘 이해하고 있느냐' 도 이래서 엄청 중요한 것 같다.
문제를 다시 읽으면 느낄 수 있는 점이, 단순히 배치 분포 방식만 알고 있으면 되는 것이다. 딱 그 수준까지만 알 수 있으면 풀 수 있는 문제다
이 문제를 해결하기 위해선 전개도를 배열에 굳이 표현할 필요도 없다는 것을 깨달으면, 처음부터 무조건 배열로만 표현하려고 시도하는 틀에박힌 사고를 하지 않는 데에도 도움이 될 것이다.
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 2146번 다리 만들기 (0) | 2022.07.23 |
---|---|
[BaekJoon/백준] 3190번 뱀 (0) | 2022.07.22 |
[BaekJoon/백준] 9207번 페그 솔리테어 (0) | 2022.07.20 |
[BaekJoon/백준] 3055번 탈출 (0) | 2022.07.19 |
[BaekJoon/백준] 5427번 불 (0) | 2022.07.18 |