[BOJ] 14499번 : 주사위 굴리기

김영한·2021년 3월 6일
0

알고리즘

목록 보기
15/74

문제 링크 : 백준 14499번

[문제 접근]

구현문제이다.
나는 주사위의 면위치을 나타내는 dirdice배열과 해당 위치에 있는 주사위의 값을 나타내는 dice배열을 이용해 구현했다.
주사위의 면위치를 나타내는 모습(dirdice배열)이 라고 하면

  1. 북쪽은 dirdice배열에서 0->1, 1->2, 2->3, 3->0으로 움직인다.
  2. 남쪽은 dirdice배열에서 0<-1, 1<-2, 2<-3, 3<-0으로 움직인다.
  3. 서쪽은 dirdice배열에서 4<-2, 2<-5, 5<-0, 0<-4으로 움직인다.
  4. 동쪽은 dirdice배열에서 4->2, 2->5, 5->0, 0->4으로 움직인다.
  5. 인덱스 0은 주사위의 윗면을 가리키고, 2는 주사위의 아랫면을 가리킨다.

과 같은 규칙을 가진다.
ex) dirdice의 0번째 인덱스가 5면 dice[5]에 있는 값이 주사위 윗면에 있는 값이다.

dirdice배열에 있는 값을 dice배열의 인덱스에 넣어가면서 주사위 값들을 변경해주면 된다.

[소스 코드]

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int n,m,x,y,k;
int arr[21][21];
int dice[6];
int dirdice[6];
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};

void go(int dir) {
    if(dir == 0) {
        int temp = dirdice[4];
        dirdice[4] = dirdice[0];
        dirdice[0] = dirdice[5];
        dirdice[5] = dirdice[2];
        dirdice[2] = temp;
    }
    else if(dir == 1) {
        int temp = dirdice[2];
        dirdice[2] = dirdice[5];
        dirdice[5] = dirdice[0];
        dirdice[0] = dirdice[4];
        dirdice[4] = temp;
    }
    else if(dir == 2) {
        int temp = dirdice[3];
        dirdice[3] = dirdice[2];
        dirdice[2] = dirdice[1];
        dirdice[1] = dirdice[0];
        dirdice[0] = temp;
    }
    else {
        int temp = dirdice[0];
        dirdice[0] = dirdice[1];
        dirdice[1] = dirdice[2];
        dirdice[2] = dirdice[3];
        dirdice[3] = temp;
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m >> x >> y >> k;
    for(int i=0 ; i<n ; i++) 
        for(int j=0 ; j<m ; j++) cin >> arr[i][j];
    
    for(int i=0 ; i<6 ; i++) dirdice[i] = i;

    for(int i=0 ; i<k ; i++) {
        int dir;
        cin >> dir;
        dir-=1;
        int nx = x + dx[dir];
        int ny = y + dy[dir];
        if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
        go(dir); // 주사위 굴리기
        // 0이 윗면, 2가 아랫면
        if(arr[nx][ny] == 0) {
            arr[nx][ny] = dice[dirdice[2]];
        }
        else {
            dice[dirdice[2]] = arr[nx][ny];
            arr[nx][ny] = 0;
        }
        cout << dice[dirdice[0]] << "\n";
        x = nx, y = ny;
    }

    return 0;
}

0개의 댓글