[파이썬] 백준 14499번 주사위 굴리기
작성:
백준 #14499 주사위 굴리기
# 이동한 칸의 수 == 0: 주사위 바닥면 수 -> 칸
# else: 칸의 수 -> 주사위 바닥면
# 가장 처음 주사위: 모든 면이 0
# 바깥으로 이동하려는 경우 해당 명령을 무시
# 출력: 주사위가 이동할 때마다의 상단 숫자의 값
# 1. 맵 밖으로 나가는지 체크 (return boolean)
# 2. 이동하는 명령 (구른다)
# 3. 칸 - 주사위 숫자 갱신 (이동할 때마다)
N, M, y, x, K = map(int, input().split())
field = []
class Dice:
def __init__(self, y, x, top=0, bottom=0, front=0, back=0, left=0, right=0):
self.top = top
self.bottom = bottom
self.front = front
self.back = back
self.left = left
self.right = right
self.y = y
self.x = x
def roll(self, n, y, x):
if n == 1: # 동쪽
temp = self.left
self.left = self.bottom
self.bottom = self.right
self.right = self.top
self.top = temp
elif n == 2: # 서쪽
temp = self.left
self.left = self.top
self.top = self.right
self.right = self.bottom
self.bottom = temp
elif n == 3: # 북쪽
temp = self.front
self.front = self.bottom
self.bottom = self.back
self.back = self.top
self.top = temp
else: # 남쪽
temp = self.front
self.front = self.top
self.top = self.back
self.back = self.bottom
self.bottom = temp
self.y = y
self.x = x
def update(self, n, y, x):
self.roll(n, y, x)
if field[y][x] == 0:
field[y][x] = self.bottom
else:
self.bottom = field[y][x]
field[y][x] = 0
def in_map(y, x):
global N, M
if 0 <= y < N and 0 <= x < M: return True
else: return False
def move(n, dice):
if n == 1: # 동쪽
if in_map(dice.y, dice.x + 1):
dice.update(1, dice.y, dice.x+1)
return True
elif n == 2: # 서쪽
if in_map(dice.y, dice.x - 1):
dice.update(2, dice.y, dice.x-1)
return True
elif n == 3: # 북쪽
if in_map(dice.y - 1, dice.x):
dice.update(3, dice.y-1, dice.x)
return True
else: # 남쪽
if in_map(dice.y + 1, dice.x):
dice.update(4, dice.y+1, dice.x)
return True
return False
for _ in range(N):
field.append(list(map(int, input().split())))
dice = Dice(y, x)
orders = list(map(int, input().split()))
for order in orders:
if move(order, dice):
print(dice.top)
댓글남기기