14499 : 주사위 굴리기 (Python)

liliili·2023년 2월 27일

백준

목록 보기
188/214

본문 링크

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이 된다.

0개의 댓글