N
: 지도의 세로 크기 ()
M
: 지도의 가로 크기 ()
x
, y
: 주사위 놓은 좌표 ()
K
: 명령의 개수
크기가 N×M인 지도의 0이 쓰여져 칸에 주사위가 놓여져 있을 때, 명령에 따라 주사위가 이동할 때마다 상단에 쓰여 있는 값을 구해 출력하는 문제이다.
움직이기 전 처음 주사위의 모든 면엔 0이 적혀있다.
따라서 주사위의 각 면의 값을 이용하기 위해 조건에 따라 초기값 0으로 된 리스트를 만들어준다.
굴리는 방향에 따른 주사위 면 위치 변화
주사위의 이동
0
⭕️ = 주사위 바닥면에 쓰여 있는 수 → 칸에 복사0
❌ = 칸에 쓰여 있는 수 → 주사위 바닥면에 복사 & 칸의 수 0→ 명령 저장한 리스트에 하나씩 접근해서 범위 내 이동하도록 구현한다.
지도 입력 →
명령을 하나씩 수행하면서 움직임 →
최종 시간복잡도
로,최악의 경우 이 되어 제한 시간 2초 내에 연산이 가능하다.
for문으로 명령 수행하면서 지도 이동
import sys
input = sys.stdin.readline
# 주사위 면 변화 함수
def move_dice(order):
if order == 1: # 동쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[3], dice[1], dice[0], dice[5], dice[4], dice[2]
elif order == 2: # 서쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[2], dice[1], dice[5], dice[0], dice[4], dice[3]
elif order == 3: # 북쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[4], dice[0], dice[2], dice[3], dice[5], dice[1]
else: # 남쪽
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = dice[1], dice[5], dice[2], dice[3], dice[0], dice[4]
# N, M, x, y, K 입력
N, M, x, y, K = map(int, input().split())
# 지도에 쓰여 있는 수 입력
map_info = [list(map(int, input().split())) for _ in range(N)]
# 이동 명령 입력
orders = list(map(int, input().split()))
# 각 면의 값 초기화
dice = [0, 0, 0, 0, 0, 0]
# 이동 방향
moves = [(0, 1), (0, -1), (-1, 0), (1, 0)]
# 명령 수행
for order in orders:
# 이동
nx = x + moves[order - 1][0]
ny = y + moves[order - 1][1]
# 범위 내 이동
if 0 <= nx < N and 0 <= ny < M:
x, y = nx, ny
# 주사위 면 변화
move_dice(order)
# 주사위 숫자 변화
if map_info[x][y] == 0:
map_info[x][y] = dice[5]
else:
dice[5] = map_info[x][y]
map_info[x][y] = 0
# 결과 출력
print(dice[0])