import sys
input=sys.stdin.readline
from collections import deque
L_I=lambda:list(map(int,input().split()))
I_S=lambda:map(int,input().split())
def BFS(x,y):
breath=deque([0,0,0])
high=deque([0,0,0,0])
while Move:
next_Move = Move.popleft()
if next_Move==1 and y+1<M: #동쪽
breath[0],high[3],breath[2],high[1]=high[3],breath[2],high[1],breath[0]
y+=1
elif next_Move==2 and 0<=y-1: #서쪽
breath[0],high[1],breath[2],high[3]=high[1],breath[2],high[3],breath[0]
y-=1
elif next_Move==3 and 0<=x-1: # 북쪽
high.appendleft(high.pop())
x-=1
elif next_Move==4 and x+1<N: # 남쪽
high.append(high.popleft())
x+=1
else:
continue
if graph[x][y]==0: #주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다
graph[x][y]=high[1]
else:
breath[1]=graph[x][y]
high[1]=graph[x][y]
graph[x][y]=0
#0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
print(high[-1])
N,M,x,y,K=I_S()
graph=[ L_I() for _ in range(N) ]
Move=deque(L_I())
BFS(x,y)
📌 어떻게 접근할 것인가?
삼성문제집에있는 문제입니다. 또한 순수구현문제입니다.
주사위 도면을 생각해서 가로길이 배열 3개 , 세로길이 배열 4개를 덱으로 만들고 풀었습니다.
북쪽과 남쪽으로 가는건 쉽습니다.
high.appendleft(high.pop()) ; high.append(high.popleft())
위코드처럼 하면됩니다.
다만 동쪽과 서쪽으로 갈때는 직접 그림을 그리면서 어떤 원리로 이동하는지 확인해야합니다.
2
4 1 3
5
6
"""
동쪽
4->6
6->3
3->1
1->4
서쪽
4->1
1->3
3->6
6->4
"""
위와같은 주사위 도면이 있을때 동쪽과 서쪽은 위 주석내용이 성립합니다.
그리고 중요한 사실은 이동할 값이 그래프에 값이 존재한다면 그 값은 주사위의 바닥이 된다는 점입니다.
✅ 문제에서 주의해야할 점
주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다
. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.