본문 바로가기
[백준]

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

by Hevton 2022. 10. 10.
반응형

 

주사위굴리기 문제를 풀어봤다면, 비교적 쉽게 풀 수 있는 문제였다.

 

이 문제의 유형은 주사위 전개도로 확실히 정해져 있기에, 추가 유형에 대한 문제가 나오긴 어렵겠지만

전개도에 관련한 문제를 어떻게 풀면 좋을까에 대한 답으로, 이렇게 쉽게 1차원적 배열로 나열하여 규칙성에 대해서만 캐치하면 된다는 생각을 배워간다고 보면 된다.

 

 

전개도를 직접 그려보면 생각에 엄청난 도움이 된다

숫자의 규칙이 어떻게 변하는지를 보고, 함수를 구현하면 된다.

 

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

int N, M, K;

int MAP[20][20];
bool VISIT[20][20];


int mx[4] = {0, 1, 0, -1};
int my[4] = {1, 0, -1, 0};

int SX = 0, SY = 0, DIR = 0;
int TOTAL_SCORE = 0, SCORE = 0;

int DICE[6] = {1, 2, 3, 4, 5, 6}; // 1이 천장, 6이 바닥


void left_roll() {
    
    int t = DICE[0];
    
    DICE[0] = DICE[2];
    DICE[2] = DICE[5];
    DICE[5] = DICE[3];
    
    DICE[3] = t;
    
}

void right_roll() {
    
    int t = DICE[0];
    
    DICE[0] = DICE[3];
    DICE[3] = DICE[5];
    DICE[5] = DICE[2];
    
    DICE[2] = t;
    
}

void bottom_roll() {
 
    int t = DICE[0];
    
    DICE[0] = DICE[1];
    DICE[1] = DICE[5];
    DICE[5] = DICE[4];
    
    DICE[4] = t;
    
}

void top_roll() {
    
    int t = DICE[0];
    
    DICE[0] = DICE[4];
    DICE[4] = DICE[5];
    DICE[5] = DICE[1];
    
    DICE[1] = t;
    
}


void dfs(int x, int y) {
    
    VISIT[x][y] = true;
    
    SCORE += MAP[x][y];
    
    for(int i = 0; i < 4; i++) {
        
        int xx = x + mx[i];
        int yy = y + my[i];
        
        
        if(xx < 0 || xx >= N || yy < 0 || yy >= M)
            continue;
        
        
        if(!VISIT[xx][yy] && MAP[xx][yy] == MAP[x][y])
            dfs(xx, yy);
    }
    
}


int main() {
    
    cin >> N >> M >> K;
    
    
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            
            cin >> MAP[i][j];
        }
        
    }
    
    
    while(K--) {
        
        memset(VISIT, 0, sizeof(VISIT));
        SCORE = 0;
        
        int xx = SX + mx[DIR];
        int yy = SY + my[DIR];
        
        
        if(xx < 0 || xx >= N || yy < 0 || yy >= M) {
            
            DIR = (DIR + 2) % 4;
            
            xx = SX + mx[DIR];
            yy = SY + my[DIR];
            
        }
        
                
        dfs(xx, yy);
        TOTAL_SCORE += SCORE;
        
        
        switch(DIR) {
                
            case 0:
                right_roll();
                break;
            case 1:
                bottom_roll();
                break;
            case 2:
                left_roll();
                break;
            case 3:
                top_roll();
                break;
                
        }
        
        if(DICE[5] > MAP[xx][yy])
            DIR = (DIR + 1) % 4;
        else if(DICE[5] < MAP[xx][yy]) {
            
            DIR--;
            
            if(DIR < 0)
                DIR = 3;
        } else ;
        
        SX = xx; SY = yy;
        
    }
    
    cout << TOTAL_SCORE << "\n";
    
    
}

 


 

started at 23:40

ended at 00:17

반응형