Gidhub BE Developer

[BOJ] 14499. 주사위 굴리기

2018-10-19
goodGid

Problem

Problem URL : 주사위 굴리기


[1] Answer Code (18. 10. 19)

#include<iostream>
#include<vector>
#define p pair<int,int>
using namespace std;

// 동 서 북 남
int dx[] = {0,0,0,-1,1};
int dy[] = {0,1,-1,0,0};

int dice[7] = {0,0,0,0,0,0,0};

void roll_dice(int dir){
    int tmp_dice[7];
    for(int i=1; i<=6; i++){
        tmp_dice[i] = dice[i];
    }
    
    if( dir == 1){ // 동
        dice[1] = tmp_dice[6];
        dice[3] = tmp_dice[5];
        dice[5] = tmp_dice[1];
        dice[6] = tmp_dice[3];
    }
    else if( dir == 2){ // 서
        dice[1] = tmp_dice[5];
        dice[3] = tmp_dice[6];
        dice[5] = tmp_dice[3];
        dice[6] = tmp_dice[1];
    }
    else if( dir == 3){ // 북
        dice[1] = tmp_dice[2];
        dice[2] = tmp_dice[3];
        dice[3] = tmp_dice[4];
        dice[4] = tmp_dice[1];
    }
    else { // 남
        dice[1] = tmp_dice[4];
        dice[2] = tmp_dice[1];
        dice[3] = tmp_dice[2];
        dice[4] = tmp_dice[3];
    }
}

int map[25][25];
int n,m;

bool inRange(int x, int y){
    if(x < 0 || x >= n || y < 0 || y >= m)
        return false;
    return true;
}

void change_dice(int x, int y, int dice_idx){
    if(map[x][y] == 0)
        map[x][y] = dice[dice_idx];
    else{
        dice[dice_idx] = map[x][y];
        map[x][y] = 0;
    }
}


int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    
    int x, y;
    cin >> x >> y ;
    
    int tc;
    cin >> tc;
    
    for(int i=0; i<n; i++)
        for(int j=0; j<m; j++)
            cin >> map[i][j];
    
    for(int i=0; i<tc; i++){
        int dir;
        cin >> dir;
        x += dx[dir];
        y += dy[dir];
        if(! inRange(x, y)){
            x -= dx[dir];
            y -= dy[dir];
            continue;
        }
        
        /*
         1 : 동쪽
         2 : 서쪽
         3 : 북쪽
         4 : 남쪽
         
         주사위 Index
         위 : 1
         앞 : 2
         바닥 : 3
         뒤 : 4
         오른쪽 : 5
         왼쪽 : 6
         */
        if(dir == 1){ // 바뀌는 면 : 오른쪽
            change_dice(x, y, 5);
        }
        else if (dir == 2){ // 바뀌는 면 : 왼쪽
            change_dice(x, y, 6);
        }
        else if (dir == 3){ // 바뀌는 면 : 뒤
            change_dice(x, y, 4);
        }
        else if (dir == 4){ // 바뀌는 면 : 앞
            change_dice(x, y, 2);
        }
        roll_dice(dir);
        cout << dice[1] << endl;
    }
    return 0;
}

Review

  • 삼성 역량 테스트 기출 문제

  • 닥치고 하드코딩

  • 1시간 넘게 소요

  • TC 맞았는데 결과값을 잘못봐서 디버깅하느라 시간이 더 소요됐다.

  • 머리로 주사위 굴리는데 안돌아가서 너무 힘들었다.


Recommend

Index