Coding Test/Problem Solving

[BOJ 14499] 주사위 굴리기

짱정연 2024. 1. 20. 22:01
반응형

1. 문제 설명

2. 구현 아이디어 1 - 맞았습니다!!

주사위의 면이 한 줄짜리면 쉬울텐데 ...! 십자가 모양이라서 주사위 각 면에 있는 수를 어떻게 저장할지 고민되었다.

일단 동서남북으로 굴렸을 때 주사위의 도면 변화를 그려봤다.

 

 

주사위의 각 면을 1차원 리스트로 관리할 때, 그림 아래 적은 것처럼 각 면에 적힌 숫자가 어느 면으로 가야할지 정할 수 있다.

그래서 dice라는 원본 리스트를 만들고, 구르는 방향에 따라 원소의 위치를 변경한 newDice 리스트를 만들어 명령마다 dice를 newDice로 갱신해주었다.

 

나머지는 문제에 나와있는 그대로 코드로 구현하면 된다.

#include <bits/stdc++.h>

using namespace std;

int n, m, x, y, k;
int board[20][20];
vector<int> dice = vector<int>(7);
int command;
// 명령과 index를 맞추기 위해 0번째 원소는 비워둠
int dx[5] = {0, 0, 0, -1, 1};
int dy[5] = {0, 1, -1, 0, 0};
int nx, ny;

vector<int> tumble(int cmd) {
    vector<int> newDice = vector<int>(7);
    switch (command) {
        case 1: // 동
            newDice = {0, dice[4], dice[2], dice[1], dice[6], dice[5], dice[3]};
            break;
        case 2: // 서
            newDice = {0, dice[3], dice[2], dice[6], dice[1], dice[5], dice[4]};
            break;
        case 3: // 북
            newDice = {0, dice[5], dice[1], dice[3], dice[4], dice[6], dice[2]};
            break;
        case 4: // 남
            newDice = {0, dice[2], dice[6], dice[3], dice[4], dice[1], dice[5]};
            break;
    }

    return newDice;
}

int main(int argc, char** argv)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

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

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

        // 바깥으로 이동시키려고 하는 경우 skip
        if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
        // 주사위를 굴린다
        dice = tumble(command);
        // 칸에 쓰여있는 수가 0이라면 주사위 바닥면에 쓰여 있는 수를 칸에 복사
        if (board[nx][ny] == 0) board[nx][ny] = dice[6];
        else { // 0이 아니라면
            // 칸에 있는 수를 주사위 바닥 면에 복사하고
            dice[6] = board[nx][ny];
            // 칸에 있는 수는 0이 된다
            board[nx][ny] = 0;
        }
        x = nx;
        y = ny;

        cout << dice[1] << endl;
    }
    return 0;
}

반응형