본문 바로가기

카테고리 없음

[c++][백준 14499][구현] 주사위 굴리기 - 컴도리돌이

728x90

 

 

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

 


풀이 과정

 

더 쉽게 풀 수 있는 방법이 있을거 같지만 시간을 재고 푸는 바람에 하드 구현을 했던거 같다.. 방향 값이 입력 받을 때마다 먼저 주사위를 이동시켜서 바깥으로 이동할 경우는 제외시켰다. 안쪽으로 이동할 경우 rotation 함수를 실행 시키는데 해당 함수는 방향과 이동된 좌표(주사위 입장에서는 바닥)를 넘겨 주었다. 

 

그 이후에는 간단하게 구현하는 방법이 생각나지 않아서 주사위의 배열 값을 6으로 지정하고 처음부터 배열의 끝 인덱스까지 위,북,동,남,서,아래로 지정하였다. 

 

그 다음부터는 방향에 맞게 구현을 하였는데 예로들면 방향이 1이면 동쪽 방향으로 주사위가 굴러가게끔 구현을 해야한다. 그러면 바닥에 있는 값을 임시 저장하고, 동쪽에 있는 값을 바닥에 저장하고 윗면에 있는 값을 동쪽에 저장하고... 이런 식으로 순차적으로 저장하여 마지막에 임시 저장한 바닥의 값을 서쪽에 저장하고 윗면 인덱스인 0에 해당한 값을 출력하게끔 설정하였다.


#include<iostream>
#include<vector>

using namespace std;

int n,m,x,y,k;

vector<vector<int>> matrix;

int dx[] = {0,0,0,-1,1};
int dy[] = {0,1,-1,0,0};

int cube[] = {0,0,0,0,0,0}; //위0,북1,동2,남3,서4,아래5

void init(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}

void input(){
    cin >> n >> m >> x >> y >> k;

    matrix.resize(n,vector<int>(m,0));

    for(int i=0; i< n ; i++){
        for(int j=0; j<m ; j++){
            cin >> matrix[i][j];
        }
    }
}

void rotation(int dir,int r,int c){
    if(dir == 1){
        int buttom = cube[5];
        cube[5] = cube[2];//동 -> 아래
        cube[2] = cube[0];//위 - > 동
        cube[0] = cube[4];//서 -> 위
        cube[4] = buttom;//아래 -> 서
        if(matrix[r][c] == 0){
            matrix[r][c] = cube[5];
        }
        else{
            cube[5] = matrix[r][c];
            matrix[r][c] = 0;
        }
    }
    else if(dir == 2){
        int buttom = cube[5];
        cube[5] = cube[4];//서 -> 아래
        cube[4] = cube[0];//위 -> 서
        cube[0] = cube[2];//동 -> 위
        cube[2] = buttom;//아래 -> 동
        if(matrix[r][c] == 0){
            matrix[r][c] = cube[5];
        }
        else{
            cube[5] = matrix[r][c];
            matrix[r][c] = 0;
        }
    }
    else if(dir == 3){
        int buttom = cube[5];
        cube[5] = cube[1];//북 -> 아래
        cube[1] = cube[0];//위 -> 북
        cube[0] = cube[3];//남 -> 위
        cube[3] = buttom;//아래 -> 남

        if(matrix[r][c] == 0){
            matrix[r][c] = cube[5];
        }
        else{
            cube[5] = matrix[r][c];
            matrix[r][c] = 0;
        }
    }
    else if(dir == 4){
        int buttom = cube[5];
        cube[5] = cube[3];//남 -> 아래
        cube[3] = cube[0];//위 -> 남
        cube[0] = cube[1];//북 -> 위
        cube[1] = buttom;//아래 -> 북
        if(matrix[r][c] == 0){
            matrix[r][c] = cube[5];
        }
        else{
            cube[5] = matrix[r][c];
            matrix[r][c] = 0;
        }
    }

    cout << cube[0] << '\n';
}

void solution(){

    for(int i=0,input;i <k ;i++){
        cin >> input;
        int nx = x + dx[input];
        int ny = y + dy[input];

        if(nx < 0 or ny < 0 or nx >= n or ny >=m ) continue;
        else{
            x = nx, y= ny;
            rotation(input,x,y);
        }
    }
}

int main(){
    input();
    solution();
}