알고리즘/시뮬레이션 & 구현

[백준/구현/C++] 14499번 주사위 굴리기 (삼성 SW 역량 테스트 기출)

데메즈 2023. 1. 23. 12:14
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

문제 해결 방법

주사위가 굴려질 때 마다 윗면을 어떻게 체크할까 하다가 위, 앞, 오른쪽을 표시하는 포인터를 구현하기로 했다.

그러면 주사위가 굴려질 때 마다 인덱스가 오른쪽처럼 변하게 된다

 

전체 코드
#include <bits/stdc++.h>

using namespace std;

int n, m, x, y, k;
int mapp[21][21];
int plan[1001];
int dx[] = {0, 0, 0, -1, 1}; // 동, 서, 북, 남
int dy[] = {0, 1, -1, 0, 0};
int dice[7];

void input(){
    cin >> n >> m >> x >> y >> k;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> mapp[i][j];
        }
    }
    for(int i=0; i<k; i++){
        cin >> plan[i];
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();

    int top = 1, front = 2, right = 3;
    for(int i=0; i<k; i++){
        int dir = plan[i];
        x += dx[dir]; // 주사위 이동
        y += dy[dir];

        if(x<0 || x>=n || y<0 || y>=m){
            x -= dx[dir]; // 원래 위치로
            y -= dy[dir];
            continue;
        }

        if(dir == 1){ // 주사위 굴리기
            int temp = top;
            top = 7 - right;
            right = temp;
        } else if(dir ==2){
            int temp = top;
            top = right;
            right = 7-temp;
        } else if(dir == 3){
            int temp = top;
            top = front;
            front = 7 - temp;
        } else {
            int temp = front;
            front = top;
            top = 7 - temp;
        }

        if(mapp[x][y] == 0){
            mapp[x][y] = dice[7 - top];
        } else {
            dice[7-top] = mapp[x][y];
            mapp[x][y] = 0;
        }
        cout << dice[top] << '\n';
    }


    return 0;
}
728x90
반응형