프로그래밍/알고리즘

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

고등어찌짐 2022. 9. 21. 20:50

 

1. 다음에 가려는 방향과 좌표를 체크

2. 가려는 방향과 좌표가 존재하면 주사위를 굴리고 경우에따라 수를 복사

 

# 처음 주사위 모든 면은 0
#
# - 주사위를 굴렸을 때 이동한 칸에 쓰여있는 수가
#     ㄴ 0 이다 : 주사위의 바닥면에 있듣 수가 칸에 복사됨
#     ㄴ 0 이 아니다 : 칸에 쓰인 수가 주사위 바닥에 복사되고, 칸의 수는 0 이 됨
#     바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다
# - 주사위가 이동했을때마다 상단에 쓰인 값을 출력


from collections import deque
import copy


# 방향에 따라 주사위 굴리기
def move_dice(arr, dir):
    arr = copy.deepcopy(arr)

    if dir == 1:
        arr[1].appendleft(arr[3].pop())
        arr[3] = deque([arr[1].pop()])

    elif dir == 2:
        arr[1].append(arr[3].pop())
        arr[3] = deque([arr[1].popleft()])

    elif dir == 3:
        arr[0].append(arr[1][1])
        arr[3].append(arr[0].popleft())
        arr[2].append(arr[3].popleft())
        arr[1][1] = arr[2].popleft()

    elif dir == 4:
        arr[2].append(arr[1][1])
        arr[3].append(arr[2].popleft())
        arr[0].append(arr[3].popleft())
        arr[1][1] = arr[0].popleft()

    return arr


# 움직여야하는 방향과 방향에 따른 x, y 좌표값
def set_dir(x, y, dir):
    dx = [0, 0, 0, -1, 1]
    dy = [0, 1, -1, 0, 0]
    nx, ny = x + dx[dir], y + dy[dir]

    if 0 <= nx < n and 0 <= ny < m:
        return nx, ny, dir
    else:
        return None, None, None


if __name__ == '__main__':
    n, m, x, y, k = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(n)]
    dirs = map(int, input().split())
    dice = [deque([0]), deque([0, 0, 0]), deque([0]), deque([0])]

    # 가려는 방향과 좌표를 찾는다.
    for dir in dirs:
        nx, ny, dir = set_dir(x, y, dir)
        # 가려는 방향이 존재하면 주사위를 굴리고 수를 복사
        if dir:
            score = board[nx][ny]
            dice = move_dice(dice, dir)
            if board[nx][ny] == 0:
                board[nx][ny] = dice[3][0]
            else:
                dice[3][0] = board[nx][ny]
                board[nx][ny] = 0
            x, y = nx, ny
            print(dice[1][1])

 

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