반응형

문제 링크

 

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

 

풀이 )

  문제를 풀기에 앞서 주사위를 어떻게 표현할지를 생각해봐야한다.

  주사위의 삼면을 정하면 나머지 삼면은 고정되기 때문에 윗면, 오른쪽면, 앞면을 각각 diceU, diceR, diceF로 설정했다.

(아랫면, 왼쪽, 뒷면은 각각 5-diceU, 5-diceR, 5-diceF(눈의 수 1~6이 아닌 인덱스 0~5로 이루어져있기 때문에))

  동, 서, 남, 북에 대해서 순서대로 구현을 했다. (이동에 앞서 바깥으로 이동시키는 경우 해당 명령어를 무시한다.)

  • 동쪽 이동: 윗면이 오른쪽면으로 가고, 왼쪽면이 윗면으로 간다.
  • 서쪽 이동: 윗면이 왼쪽면으로 가고, 오른쪽면이 윗면으로 간다.
  • 남쪽 이동: 윗면이 앞면으로 가고, 뒷면이 윗면으로 간다.
  • 북쪽 이동: 윗면이 뒷면으로 가고, 앞면이 윗면으로 간다.

이후 지도를 확인하여

  • 0인 경우 주사위 밑면(dice[5-diceU])의 값을 지도 칸에 저장하고
  • 0이 아닌 경우 지도의 값을 주사위 밑면에 저장하고, 해당 지도 칸의 값을 0으로 만든다.

마지막으로 주사위의 윗면의 수(dice[diceU])를 출력한다.

 

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

using namespace std;

vector<vector<int>> map;
int dice[6] = {0, };
int diceU = 0, diceR = 2, diceF = 4;
int x, y;

void move_print(void){
    if(map[x][y]){
        dice[5-diceU] = map[x][y];
        map[x][y] = 0;
    }
    else
        map[x][y] = dice[5-diceU];
    cout << dice[diceU] << '\n';
}

int main(void){
    int n, m, k;
    cin >> n >> m >> x >> y >> k;
    for(int i = 0; i < n; ++i){
        vector<int> tmp;
        for(int j = 0; j < m; ++j){
            int cell;
            cin >> cell;
            tmp.push_back(cell);
        }
        map.push_back(tmp);
    }

    while(k--){
        int com;
        cin >> com;

        if(com == 1){
            if(y == m-1)
                continue;
            y++;
            swap(diceU, diceR);
            diceU = 5-diceU;
        }
        else if(com == 2){
            if(y == 0)
                continue;
            y--;
            swap(diceU, diceR);
            diceR = 5-diceR;
        }
        else if(com == 3){
            if(x == 0)
                continue;
            x--;
            swap(diceU, diceF);
            diceF = 5-diceF;
        }
        else{
            if(x == n-1)
                continue;
            x++;
            swap(diceU, diceF);
            diceU = 5-diceU;
        }
        move_print();
    }
    return 0;
}

 

주의 )

- 문제에서 주어지는 좌표 x, y의 순서에 유의한다. (세로, 가로)

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1065 : 한수  (0) 2020.12.07
[C++] 백준 - 17144 : 미세먼지 안녕!  (0) 2020.12.07
[C++] 백준 - 1874 : 스택 수열  (0) 2020.12.01
[C++] 백준 - 10773 : 제로  (0) 2020.12.01
[C++] 백준 - 5430 : AC  (0) 2020.11.30

+ Recent posts