개발

[백준] 14499 주사위 굴리기 (파이썬) 본문

알고리즘/문제

[백준] 14499 주사위 굴리기 (파이썬)

쇼팽리스트 2022. 8. 29. 23:17

처음에는 deque을 이용해서 움직일때마다 rotate를 하니 마니 뻘짓을 하고 있었는데
간단하게 정면, 바닥면, 오른쪽면에 초기 값을 부여하고 행동을 할때마다 이 값들을 업데이트 하는 방식으로 구현했다.
실제 주사위도 바닥면과 밑면의 합이 일정하기 때문에 이를 이용하였다.
아이디어를 떠올리기 매우 힘들었다..

import sys
input = sys.stdin.readline

row, col, x, y, k = map(int,input().split())
board = [list(map(int,input().split())) for _ in range(row)]
dir = list(map(int,input().split()))
move = [(0,1),(0,-1),(-1,0),(1,0)]
dice = [0,0,0,0,0,0]
front = 2
down = 1
right = 5

for i in range(len(dir)):
  (dx, dy) = move[dir[i]-1]
  nx = x + dx
  ny = y + dy
  if 0 <= nx < row and 0 <= ny < col:
    if board[nx][ny] != 0:
      if dir[i] == 1:
        down, right = right, abs(5-down)
        dice[down] = board[nx][ny]
        board[nx][ny] = 0
      elif dir[i] == 2:
        down, right = abs(5-right), down
        dice[down] = board[nx][ny]
        board[nx][ny] = 0
      elif dir[i] == 3:
        front, down = down, abs(5-front)
        dice[down] = board[nx][ny]
        board[nx][ny] = 0
      elif dir[i] == 4:
        front, down = abs(5-down) ,front
        dice[down] = board[nx][ny]
        board[nx][ny] = 0

    elif board[nx][ny] == 0:
      if dir[i] == 1:
        down, right = right, abs(5-down)
        board[nx][ny] = dice[down]
      elif dir[i] == 2:
        down, right = abs(5-right), down
        board[nx][ny] = dice[down]
      elif dir[i] == 3:
        front, down = down, abs(5-front)
        board[nx][ny] = dice[down]
      elif dir[i] == 4:
        front, down = abs(5-down) ,front
        board[nx][ny] = dice[down]
    x, y = nx, ny
    print(dice[abs(5-down)])