출처 : https://www.acmicpc.net/problem/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()))
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
'알고리즘 > [Python] 백준' 카테고리의 다른 글
(Python) 백준 3190번 : 뱀 (0) | 2020.02.05 |
---|---|
(Python) 백준 1966번 : 프린터 큐 (0) | 2020.02.05 |
(Python) 백준 1018번 : 체스판 다시 칠하기 (0) | 2020.02.04 |
(Python) 백준 2178번 : 미로 탐색 (0) | 2020.02.02 |
(Python) 백준 1094번 : 막대기 (0) | 2020.01.22 |