(Python) 백준 14499번 : 주사위 굴리기
알고리즘/[Python] 백준

(Python) 백준 14499번 : 주사위 굴리기

 

출처 : https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

 

작성한 코드가 실행 조건이 비슷해서 일부 겹치는 부분이 있긴 하지만 코드 길이가 조금 길어지더라도 이해하기 쉽도록 풀어서 코딩했다. 

 

 

  • 풀이 방법

주사위의 전개도를 행과 열 부분으로 나누고, 동서남북으로 이동시 어떻게 반영해주어야 할지를 고려했다.

큰 맥락으로는 아래 그림을 참고하면 된다. 


 

(Python) 백준 14499번 주사위 굴리기

(Python) 백준 14499번 : 주사위 굴리기

  • 알고리즘 분류 :
    • 시뮬레이션

  • 입력

지도 크기 : 세로 N, 가로 M (1<=N, M<=20)
주사위 놓은 곳의 좌표 : x, y (0<=x<=N-1, 0<=y<=M-1)
명령 개수 : K (1<=K<=1000)
주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다.
지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다.

1:동쪽, 2:서쪽, 3:북쪽, 4:남쪽

  • 출력

이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우 해당 명령을 무시해야 하며, 출력도 하면 안된다.


In [1]:
from collections import deque

N,M,x,y,K = map(int, input().split())

map_array = [list(map(int, input().split())) for _ in range(N)]

K_array = list(map(int, input().split()))
4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2
In [2]:
## col_4[1]와 row_4[1]은 동일하다. (주사위의 윗부분을 의미)
## col_4[-1]와 row_4[-1]은 동일하다. (주사위의 밑바닥을 의미)
col_4 = deque([0,0,0,0])
row_4 = deque([0,0,0,0])
In [3]:
for move in K_array:
    if move == 1: ## 동쪽으로 이동 -> row_4를 rotate한다.
        ## 주사위가 바깥으로 벗어나려고 하는 경우 해당 명령을 무시해야 한다. 출력하면 안된다.
        if 0<=x<=N-1 and 0<=y+1<=M-1:
            y = y+1
            row_4.rotate(1)
            col_4[1] = row_4[1] ## col_4[1]과 row_3[1]은 항상 같은 값을 가져야만 한다. (둘다 주사위의 윗부분을 의미)
            col_4[-1] = row_4[-1] ## col_4[-1]과 row_3[-1]은 항상 같은 값을 가져야만 한다. (둘다 주사위의 밑부분을 의미)
            print(col_4[1]) ## 주사위의 현재 윗부분을 print한다.
            
            ## 지도가 0이라면 주사위 바닥에 있는 숫자를 지도로 복사한다.
            ## 지도가 0이 아니라면 지도의 숫자를 주사위 바닥으로 복사하고, 지도의 숫자를 0으로 만든다.
            if map_array[x][y] == 0:
                map_array[x][y] = col_4[-1]
            else:
                col_4[-1] = map_array[x][y] ## col_4[-1]과 row_4[-1]은 항상 같은 값을 가져야만 한다.(둘다 주사위 밑부분)
                row_4[-1] = map_array[x][y]
                map_array[x][y] = 0
        else:
            continue ## 주사위가 바깥으로 벗어났기 때문에 해당 명령을 무시하고 다음 명령을 수행한다.
    elif move == 2: ## 서쪽으로 이동 -> row_4를 rotate한다.
        if 0<=x<=N-1 and 0<=y-1<=M-1:
            y = y-1
            row_4.rotate(-1)
            col_4[1] = row_4[1]
            col_4[-1] = row_4[-1]
            print(col_4[1])
            
            if map_array[x][y] == 0:
                map_array[x][y] = col_4[-1]
            else:
                col_4[-1] = map_array[x][y]
                row_4[-1] = map_array[x][y]
                map_array[x][y] = 0
        else:
            continue
    elif move == 3: ## 북쪽으로 이동 -> col_4를 rotate한다.
        if 0<=x-1<=N-1 and 0<=y<=M-1:
            x = x-1
            col_4.rotate(-1)
            row_4[1] = col_4[1]
            row_4[-1] = col_4[-1]
            print(col_4[1])
            
            if map_array[x][y] == 0:
                map_array[x][y] = col_4[-1]
            else:
                col_4[-1] = map_array[x][y]
                row_4[-1] = map_array[x][y]
                map_array[x][y] = 0
        else:
            continue
    else: ## 남쪽으로 이동 -> col_4를 rotate한다.
        if 0<=x+1<=N-1 and 0<=y<=M-1:
            x = x+1
            col_4.rotate(1)
            row_4[1] = col_4[1]
            row_4[-1] = col_4[-1]
            print(col_4[1])
            
            if map_array[x][y] == 0:
                map_array[x][y] = col_4[-1]
            else:
                col_4[-1] = map_array[x][y]
                row_4[-1] = map_array[x][y]
                map_array[x][y] = 0
        else:
            continue
0
0
3
0
0
8
6
3