Liam SY Kim
by Liam SY Kim
1 min read

Categories

문제링크

전체코드

위 문제는 시뮬레이션 문제로 계산량이 많은 것을 특징으로 한다.

문제 이해 및 적용하기

요약하여 이해하자면, 주사위를 입력받은 지도 위에 두어서

지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.

위 조건을 이행하면서 매 턴마다의 주사위 상단에 위치한 숫자를 출력해주면 되는 문제이다.

본인은 주사위를 동서 방향, 남북방향으 나누어서 Dx, Dy 배열로 구성해주었다.

diceDx = [0, 0, 0, 0]
diceDy = [0, 0, 0, 0]

어느방향으로 돌아가던 이동할 때에, 기본적으로 한칸 씩만 미루어주면 되며, 가장 위에 위치한 인덱스인 1번과, 가장 밑에있는 인덱스인 3번만 업데이트를 해주면 주사위가 돌아간다.

if dir == 1: 
  diceDx.insert(0,diceDx.pop())
  diceDy[3] = diceDx[3]
  diceDy[1] = diceDx[1]

주의할 점

  • 주사위를 표현하는 방식을 찾아야 함.
  • 입력 받을 때에 x,y 순서가 아니라 y,x 순서로 받아야한다. 예제 코드에서는 동일하게 값이 출력되기 떄문에 실수를 찾기 힘들 수도 있다.

전체코드

import sys
import copy
input = sys.stdin.readline

# declare the input data
N, M, y, x, K = map(int,input().split())
mapList = []
for i in range(N):
  mapList.append(list(map(int,input().split())))
orderList = list(map(int,input().split()))

# turn the dice
diceDx = [0, 0, 0, 0]
diceDy = [0, 0, 0, 0]
def dice(dir, cx, cy):
  # east
  if dir == 1: 
    diceDx.insert(0,diceDx.pop())
    diceDy[3] = diceDx[3]
    diceDy[1] = diceDx[1]
  # west
  elif dir == 2:
    diceDx.append(diceDx.pop(0))
    diceDy[3] = diceDx[3]
    diceDy[1] = diceDx[1]
  # north
  elif dir == 3:
    diceDy.append(diceDy.pop(0))
    diceDx[3] = diceDy[3]
    diceDx[1] = diceDy[1]
  # south
  elif dir == 4:
    diceDy.insert(0, diceDy.pop())
    diceDx[3] = diceDy[3]
    diceDx[1] = diceDy[1]

  if mapList[cy][cx] == 0:
    mapList[cy][cx] = diceDx[3]
  else:
    diceDx[3] =  mapList[cy][cx]
    diceDy[3] =  mapList[cy][cx]
    mapList[cy][cx] = 0
  return diceDx[1]

# for each order direction
mapDx = [1, -1, 0, 0]
mapDy = [0, 0, -1, 1]
for i in range(len(orderList)):
  curDir = orderList[i]
  if  (x + mapDx[curDir-1] >= 0) and (x + mapDx[curDir-1] <= len(mapList[0]) - 1) and (y + mapDy[curDir-1] >= 0) and (y + mapDy[curDir-1] <= len(mapList) - 1):
    x += mapDx[curDir-1]
    y += mapDy[curDir-1]
    print(dice(curDir, copy.deepcopy(x), copy.deepcopy(y)))