본문 바로가기
PS/BOJ

[BOJ 14499] 주사위 굴리기

by Saerong2 2020. 5. 14.

 

 

문제 링크

 

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


아이디어

  • 주사위를 굴리는 것의 구현은 주사위의 6개 면에 전개도에 나와있는 숫자로 각각 idx를 부여하면 간단하다.
    마주보는 idx끼리 짝을 이루어보면 (1,6), (2,5), (3,4)로 (x, 7-x)꼴을 이루는 것을 확인 할 수 있다.

  • 주사위를 보았을 때, u, f, s를 각각 윗면, 정면, 오른쪽면의 idx라고 하면, 초기의 (u, f, s) = (1, 5, 3)이다.

  • 이제, 문제에 기술된 순서대로 하나하나 구현하면 된다.
    1. 다음 명령이 유효하지 않다면 무시하고
    2. 입력으로 주어진 방향에 따라 굴려준다.
       예를 들어, 주사위를 동쪽으로 굴리면 u는 7-s값으로, s = u의 값으로, f는 유지된다.
    3. 주사위가 위치한 칸에 적혀있는 값에 따라 적절히 처리한다.

 


주의할 점

  • roll() 처리를 할 때, 이전의 값을 저장해야 올바른 값으로 갱신할 수 있다.
    b = a;
    a = 7-b; 로 작성하지 않음에 유의하자.

소스코드

#include<cstdio>
#include<vector>
using namespace std;

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

bool check(int x, int y, int bx, int by)
{
    if (x >= 0 && x < bx && y >= 0 && y < by)
        return true;

    return false;
}

void roll(int& a, int& b)
{
    int tmp = 7-b;
    b = a;
    a = tmp;
}

int main()
{
    int n, m, x, y, k, board[22][22];
    scanf("%d %d %d %d %d", &n, &m, &x, &y, &k);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            scanf("%d", &board[i][j]);
        }
    }

    int dice[7] = { 0,0,0,0,0,0,0 };
    int op, u = 1, f = 5, s = 3;
    int nx, ny;

    for (int i = 0; i < k; ++i) {
        scanf("%d", &op);
        nx = x + dx[op];
        ny = y + dy[op];
        if (!check(nx, ny, n, m)) continue;
        if (op == 1) {
            roll(u, s);
            y++;
        }
        else if (op == 2) {
            roll(s, u);
            y--;
        }
        else if (op == 3) {
            roll(f, u);
            x--;
        }
        else if (op == 4) {
            roll(u, f);
            x++;
        }

        if (board[x][y] == 0) {
            board[x][y] = dice[7 - u];
        }
        else {
            dice[7 - u] = board[x][y];
            board[x][y] = 0;
        }
        printf("%d\n", dice[u]);
    }
    return 0;
}

 

 

 

 

 

공부한 것을 정리하기 위한 기록입니다.

틀린 부분이 있다면 언제나 부드럽게 알려주세요.

'PS > BOJ' 카테고리의 다른 글

[BOJ 19236] 청소년 상어  (0) 2020.06.09
[BOJ 14503] 로봇청소기  (0) 2020.05.15
[BOJ 1421] 나무꾼 이다솜  (0) 2020.05.08
[BOJ 1411] 비슷한 단어  (0) 2020.05.07
[BOJ 1564] 팩토리얼5  (0) 2020.05.04

댓글