본문 바로가기
Algorithm(BOJ, Python)/Simulation

[백준_14499] 주사위굴리기 python

by kurooru 2022. 9. 4.

 

# n, m, x, y, k 입력
n, m, x, y, k = map(int, input().split())

# grid 입력
grid = [
    list(map(int, input().split()))
    for _ in range(n)
]

# order_list 입력
order_list = list(map(int, input().split()))

# 함수들
# in_range(x, y)
def in_range(x, y):
    return 0 <= x < n and 0 <= y < m

# move_down(r, c)
def move_down(r, c):

    # 전역 변수 선언
    global grid, up, front, down, back, x, y

    # 아래쪽 칸의 좌표
    nx, ny = r + 1, c

    # 아래쪽으로 굴렸을 때 각 면
    next_up = back
    next_front = up
    next_down = front
    next_back = down

    # 아래쪽 칸에 쓰여 있는 수가 0이면,
    if not grid[nx][ny]:
        # 주사위 바닥면에 있는 수가 칸에 복사
        grid[nx][ny] = next_down
    
    # 0이 아니면
    else:
        # 주사위 바닥면에 복사
        next_down = grid[nx][ny]
        # 칸의 숫자는 0으로
        grid[nx][ny] = 0
    
    # 주사위 면 관리
    up = next_up
    back = next_back
    down = next_down
    front = next_front

    # 좌표 관리
    x, y = nx, ny

# move_up(r, c)
def move_up(r, c):

    # 전역 변수 선언
    global grid, up, front, down, back, x, y

    # 위쪽 칸의 좌표
    nx, ny = r - 1, c

    # 위쪽으로 굴렸을 때의 각 면
    next_up = front
    next_back = up
    next_down = back
    next_front = down

    # 위쪽 칸에 쓰여 있는 수가 0이면,
    if not grid[nx][ny]:
        # 주사위 바닥면에 있는 수가 칸에 복사
        grid[nx][ny] = next_down
    
    # 0이 아니면,
    else:
        # 주사위 바닥면에 복사
        next_down = grid[nx][ny]
        # 칸의 숫자는 0으로
        grid[nx][ny] = 0

    # 주사위 면 관리
    up = next_up
    back = next_back
    down = next_down
    front = next_front

    # 좌표 관리
    x, y = nx, ny

# move_left(r, c)
def move_left(r, c):

    # 전역 변수 선언
    global grid, up, down, right, left, x, y

    # 왼쪽 칸의 좌표
    nx, ny = r, c - 1

    # 왼쪽으로 굴렸을 때의 각 면
    next_up = right
    next_left = up
    next_down = left
    next_right = down

    # 왼쪽 칸에 쓰여 있는 수가 0이면,
    if not grid[nx][ny]:
        # 주사위 바닥면에 있는 수가 칸에 복사
        grid[nx][ny] = next_down
    
    # 0이 아니면,
    else:
        # 주사위 바닥면에 복사
        next_down = grid[nx][ny]
        # 칸의 숫자는 0으로
        grid[nx][ny] = 0
    
    # 주사위 면 관리
    up = next_up
    down = next_down
    right = next_right
    left = next_left

    # 좌표 관리
    x, y = nx, ny

# move_right(r, c)
def move_right(r, c):

    # 전역 변수 선언
    global grid, up, down, right, left, x, y

    # 오른쪽 칸의 좌표
    nx, ny = r, c + 1

    # 오른쪽으로 굴렸을 때의 각 면
    next_up = left
    next_right = up
    next_down = right
    next_left = down

    # 오른쪽 칸에 쓰여 있는 수가 0이면,
    if not grid[nx][ny]:
        # 주사위 바닥면에 있는 수가 칸에 복사
        grid[nx][ny] = next_down
    
    # 0이 아니면,
    else:
        # 주사위 바닥면에 복사
        next_down = grid[nx][ny]
        # 칸의 숫자는 0으로
        grid[nx][ny] = 0
    
    # 주사위 면 관리
    up = next_up
    right = next_right
    down = next_down
    left = next_left

    # 좌표 관리
    x, y = nx, ny

# 설계
# 주사위의 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 값 배정
up, down, right, left, front, back = 0, 0, 0, 0, 0, 0

for order in order_list:
    # 동쪽 이동
    if order == 1:
        # 범위 내에 있으면,
        if in_range(x, y + 1):
            # 오른쪽으로 움직여주고
            move_right(x, y)
            # 주사위 윗값 출력,
            print(up)
    # 서쪽 이동
    elif order == 2:
        if in_range(x, y - 1):
            move_left(x, y)
            print(up)
    # 북쪽 이동
    elif order == 3:
        if in_range(x-1, y):
            move_up(x, y)
            print(up)
    # 남쪽 이동
    else:
        if in_range(x + 1, y):
            move_down(x, y)
            print(up)