알고리즘 풀이/백준

[ 백준 14499 ] 주사위 굴리기 - Python

12.tka 2020. 6. 4. 21:50
728x90

문제 보기

주사위 굴리기는 시뮬레이션 문제이다.

 

문제 구현 순서는 아래와 같다.

1. N x M 지도에서 주사위를 이동시키면서 주사위 값의 변화를 파악

2. 지도에 있는 값과 주사위의 값을 상황에 맞게 복사

  - 지도에 있는 값이 0일 때 주사위의 값을 지도로 복사한다.

  - 지도에 있는 값이 0이 아닐 때 지도에 있는 값을 주사위로 복사하고 지도에 있는 값을 0으로 수정한다.

3. 주사위 윗 면에 쓰인 수 출력

 

[ 값의 변화 파악 ]

4가지 방향으로 주사위가 이동할 때 주사위의 값을 유지하면서 모양을 바꾸는 것이 핵심이었다.

아래는 주사위 이동에 대해서 정리한 표이다.

 

1 - >3 1 -> 4 1 -> 2 1 -> 5
2 -> 2 2 -> 2 2 -> 6 2 -> 1
3 -> 6 3 -> 1 3 -> 3 3 -> 3
4 -> 1 4 -> 6 4 -> 4 4 -> 4
5 -> 5 5 -> 5 5 -> 1 5 -> 6
6 -> 4 6 -> 3 6 -> 5 6 -> 2

위 표를 이용하여 아래 코드의 move 함수를 작성하였다. 또한 문제에서 주어진 x, y는 기존에 알던 열과 행이 아니라 행과 열을 나타내는 값이다. 따라서 입력을 받을 때 x, y 순서가 아닌 y, x 순서로 입력받은 후 원래 알고 있던 방식으로 구현하였다.


코드

# boj 14499
# blog: jjangsungwon.tistory.com


"""
   동쪽 이동   서쪽 이동  북쪽 이동  남쪽 이동
    1 -> 3     1 -> 4    1 -> 2    1 -> 5
    2 -> 2     2 -> 2    2 -> 6    2 -> 1
    3 -> 6     3 -> 1    3 -> 3    3 -> 3
    4 -> 1     4 -> 6    4 -> 4    4 -> 4
    5 -> 5     5 -> 5    5 -> 1    5 -> 6
    6 -> 4     6 -> 3    6 -> 5    6 -> 2
"""


def move(n, arr):  # 주사위 변화
    if n == 1:    # 동
        return [0, arr[3], arr[2], arr[6], arr[1], arr[5], arr[4]]
    elif n == 2:  # 서
        return [0, arr[4], arr[2], arr[1], arr[6], arr[5], arr[3]]
    elif n == 3:  # 북
        return [0, arr[2], arr[6], arr[3], arr[4], arr[1], arr[5]]
    elif n == 4:  # 남
        return [0, arr[5], arr[1], arr[3], arr[4], arr[6], arr[2]]


if __name__ == "__main__":

    # input
    N, M, y, x, K = map(int, input().split())
    arr = [list(map(int, input().split())) for _ in range(N)]
    order = list(map(int, input().split()))

    dice = [0] * 7  # 주사위

    dy = [0, 0, 0, -1, 1]
    dx = [0, 1, -1, 0, 0]

    # 명령 수행
    for i in range(len(order)):
        if y + dy[order[i]] < 0 or y + dy[order[i]] >= N or x + dx[order[i]] < 0 or x + dx[order[i]] >= M:
            continue
        else:
            x, y = x + dx[order[i]], y + dy[order[i]]  # 좌표 이동
            dice = move(order[i], dice)  # 주사위 이동

            if arr[y][x] == 0:
                arr[y][x] = dice[6]  # 주사위 -> 칸
            else:
                dice[6] = arr[y][x]  # 칸 -> 주사위
                arr[y][x] = 0  # 칸에 있는 수 0으로 수정

            print(dice[1])
728x90