알고리즘/백준

[백준/c++] 14499번: 주사위 굴리기

녕이 2022. 11. 16. 14:30
728x90

 

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

 

처음엔 주사위의 상하좌우 전후 방향을 가리키는 포인터를 가지고 하려고 했는데, 생각보다 잘 안돼서 설마 시간이 얼마 걸리나 봤더니

2초였다...!! 시간낭비를 해버린..^^ 그냥 주사위를 열심히 굴려줬다.

 

📌 진행 순서

1. 해당 방향으로 주사위가 이동 가능한지 체크

2. 주사위 굴리기

3. 굴러간 위치의 값 확인하기

    3-1. 0이면 주사위 바닥면의 값을 지도위치에 넣어준다.

    3-2. 0이 아니면 지도위치의 값을 주사위 바닥면에 넣고, 해당 위치의 지도 값을 0으로 변경한다.

4. 주사위 상단면 값 출력

 

 

주사위의 값을 dice[4][3] 2차원 배열에 넣어주고, 

상: (1, 1)

하: (3, 1)

좌: (1, 0)

우: (1, 2)

전: (2, 1)

후: (0, 1)

좌표값으로 이용했다.

 

북/남으로 굴리면 행만 변한다. for문을 이용해서 이동시켰다.

if(com == 3){ //북
    int tmp = dice[0][1];
    for(int i=0; i<3; i++) dice[i][1] = dice[i+1][1];
    dice[3][1] = tmp;
}else if(com == 4){ //남
    int tmp = dice[3][1];
    for(int i=3; i>0; i--) dice[i][1] = dice[i-1][1];
    dice[0][1] = tmp;
}

 

동/서는 조금 복잡한데 이 규칙찾느라 조금 시간이 걸렸다. 잘 몰라서 그냥 다 적어봤음ㅎㅎ

if(com == 1){ //동
    int tmp = dice[1][2];
    dice[1][2] = dice[1][1];
    dice[1][1] = dice[1][0];
    dice[1][0] = dice[3][1];
    dice[3][1] = tmp;
}else if(com == 2){ //서
    int tmp2 = dice[1][0];
    dice[1][0] = dice[1][1];
    dice[1][1] = dice[1][2];
    dice[1][2] = dice[3][1];
    dice[3][1] = tmp2;
}

 


 

전체 코드

#include <iostream>
#include <algorithm>
using namespace std;

int n, m, x, y, k;
int arr[21][21];
int dir[5][2] = {{0, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}}; //동:1, 서:2, 북:3, 남:4
int dice[4][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}};

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.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];
    while(k--){
        int com;
        cin >> com;
        //해당 방향으로 이동가능한지 체크
        int dx = x + dir[com][0];
        int dy = y + dir[com][1];
        if(0 > dx || dx >= n || 0 > dy || dy >= m) continue; //바깥으로 이동하는 경우는 패스
        //주사위 굴리기 -> 상/하단 좌표 변경해주기
        if(com == 1){ //동
            int tmp = dice[1][2];
            dice[1][2] = dice[1][1];
            dice[1][1] = dice[1][0];
            dice[1][0] = dice[3][1];
            dice[3][1] = tmp;
        }else if(com == 2){ //서
            int tmp2 = dice[1][0];
            dice[1][0] = dice[1][1];
            dice[1][1] = dice[1][2];
            dice[1][2] = dice[3][1];
            dice[3][1] = tmp2;
        }else if(com == 3){ //북
            int tmp = dice[0][1];
            for(int i=0; i<3; i++) dice[i][1] = dice[i+1][1];
            dice[3][1] = tmp;
        }else if(com == 4){ //남
            int tmp = dice[3][1];
            for(int i=3; i>0; i--) dice[i][1] = dice[i-1][1];
            dice[0][1] = tmp;
        }
        //해당 좌표의 값 확인하기
        //0이면 주사위 바닥면의 값을 해당 좌표에 넣기
        //0이 아니면 좌표의 값을 바닥면에 넣고, 좌표의 값은 0으로 변경
        if(arr[dx][dy] == 0){
            arr[dx][dy] = dice[3][1];
        } else {
            dice[3][1] = arr[dx][dy];
            arr[dx][dy] = 0;
        }
        //주사위 상단top의 값 출력
        cout << dice[1][1] << '\n';
        x = dx; y = dy;
    }
    return 0;
}

 

 

 

 

728x90