본문 바로가기
[백준]

[BaekJoon/백준] 14499번 주사위 굴리기

by Hevton 2022. 7. 21.
반응형

 

이 문제의 가장 큰 관건은, 주사위 시뮬레이션이다.

 

 

그리고 어떻게 주사위를 표현할까? 라는 고민을 해결하지 못해서, 풀이를 검색해봤다.

 

접근이 달랐다.

 

주사위 자체를 어떻게 표현하여 규칙성 있게 움직이느냐를 고찰하기보다

 

회전을 했을때, 어떻게 변하느냐 만 생각하면 됐다.

 

서쪽으로 이동했을때 전개도면이 어떻게 변하는지

동쪽으로 이동했을때 전개도면이 어떻게 변하는지

북쪽으로 이동했을때 전개도면이 어떻게 변하는지

남쪽으로 이동했을때 전개도면이 어떻게 변하는지

 

이 '어떻게 변하는지'에 관점을 두면 풀 수 있었다.

 

그림을 그려주신 분이 계셔서, 해당 블로그를 올려놓는다.

#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