PS/백준

[백준/BOJ] 14499번 - 주사위 굴리기(Python)

행복한라이언 2023. 9. 13. 00:21
728x90
반응형

문제링크

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

핵심


코드(Python)

# https://www.acmicpc.net/problem/14499
n, m, cr, cc, k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
cmds = list(map(int, input().split()))

# 동(0)남(1)서(2)북(3)
def chang_direction(cur_dir):
    if cur_dir == 4:
        cur_dir = 1
    elif cur_dir == 1:
        cur_dir = 0
    return cur_dir
# 격자 내 이동
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
# 초기 주사위 상태(바닥, 윗면, 서쪽, 동쪽, 북쪽, 남쪽)
# 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다. 
dices = [0, 0, 0, 0, 0, 0]
# 현재 바닥(1 - 0), 윗면(6 - 1) / 서쪽면(4 - 2), 동쪽면(3 - 3) / 북쪽면(2 - 4), 남쪽면(5 - 5)
# 남쪽(4 - 100 -> 001)으로 굴림 : 바닥(5), 윗면(2) / 서쪽(4), 동쪽(3) / 북쪽(1), 남쪽(6)
# 북쪽(3 - 11)으로 굴림 : 바닥(2), 윗면(5) / 서쪽(4), 동쪽(3) / 북쪽(6), 남쪽(1)
# 서쪽(2 - 10)으로 굴림 : 바닥(4), 윗면(3) / 서쪽(6), 동쪽(1) / 북쪽(2), 남쪽(5)
# 동쪽(1 - 01 -> 00)으로 굴림 : 바닥(3), 윗면(4) / 서쪽(1), 동쪽(6) / 북쪽(2), 남쪽(5)
def simulate_S(dices):
    dices = [dices[5], dices[4], dices[2], dices[3], dices[0], dices[1]]
    return dices

def simulate_N(dices):
    dices = [dices[4], dices[5], dices[2], dices[3], dices[1], dices[0]]
    return dices

def simulate_W(dices):
    dices = [dices[2], dices[3], dices[1], dices[0], dices[4], dices[5]]
    return dices

def simulate_E(dices):
    dices = [dices[3], dices[2], dices[0], dices[1], dices[4], dices[5]]
    return dices
# 주사위 방향에 따른 회전시키기
def rotate(cur_dir):
    global dices
    if cur_dir == 0:
        return simulate_E(dices)
    elif cur_dir == 1:
        return simulate_S(dices)
    elif cur_dir == 2:
        return simulate_W(dices)
    else:
        return simulate_N(dices)
# 격자 내 이동 판단
def in_range(r, c):
    return 0 <= r < n and 0 <= c < m
# 시뮬레이션
def simulate(cr, cc, cmds):
    global nr, nc, dices
    for cmd in cmds:
        cur_dir = chang_direction(cmd)
        nr = cr + dr[cur_dir]
        nc = cc + dc[cur_dir]
        if not in_range(nr, nc):
            continue
        else:
            dices = rotate(cur_dir)
            if board[nr][nc] == 0:
                board[nr][nc] = dices[0]
            else:
                dices[0] = board[nr][nc]
                board[nr][nc] = 0
            print(dices[1])
            cr, cc = nr, nc

simulate(cr, cc, cmds)

 

728x90
반응형