https://www.acmicpc.net/problem/14499
1. 해결방법
전형적인 시뮬레이션 문제이고, 1시간 정도 걸렸다.
이 문제에서 핵심 포인트는 주사위의 값을 리스트로 미리 초기값을 구하고, 주사위가 굴려질 때마다 동 서 남 북 위 아래의 위치 값을 새로 갱신해주면 된다.
dy, dx 동서남북 이동 배열은 문제에서 1, 2, 3, 4가 동서북남이라고 명시되어있으므로, 0번째 인덱스에 0을 추가로 설정해두어야 한다.
중요한 건 주사위 리스트이다.
처음 주사위는 6면이 다 0의 값을 가지고 있으므로 0이 6개로 이루어진 리스트를 초기 값으로 저장한다.
주사위가 1, 2, 3, 4에 맞게 굴려지면 동 서 남 북 위 아래가 바껴진다. 그때마다 주사위 리스트의 값을 새로 갱신해주어야 한다.
만약 direct가 4일 때, 기존의 동쪽면이 주사위가 굴려진 후에는 아래면으로 역할이 바꿔지는 것을 이해해야 한다.
위 말이 이해가 가면 갱신 방법과 초기 세팅이 중요한 문제에서 코드로 작성하는 것은 쉽게 해결할 수 있다.
2. 정답코드
import sys
input = sys.stdin.readline
# input
N, M, y, x, K = map(int, input().split())
maps = [list(map(int, input().split())) for _ in range(N)]
k_list = list(map(int, input().split()))
# main
dy, dx = (0, 0, 0, -1, 1), (0, 1, -1, 0, 0)
dice = [0] * 6
d = maps[y][x]
for direct in k_list:
ny, nx = y + dy[direct], x + dx[direct]
e, w, s, n, u, d = dice[0], dice[1], dice[2], dice[3], dice[4], dice[5]
if 0 <= ny < N and 0 <= nx < M:
# 주사위가 이동했으니 동 서 남 북 위 아래 인덱스 값을 변경
if direct == 1:
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = u, d, s, n, w, e
elif direct == 2:
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = d, u, s, n, e, w
elif direct == 3:
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, w, d, u, s, n
elif direct == 4:
dice[0], dice[1], dice[2], dice[3], dice[4], dice[5] = e, w, u, d, n, s
if maps[ny][nx] == 0:
maps[ny][nx] = dice[5]
else:
dice[5] = maps[ny][nx]
maps[ny][nx] = 0
y, x = ny, nx
print(dice[4])
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 15685. 드래곤 커브 (0) | 2022.10.31 |
---|---|
[BOJ] 2636. 치즈 (1) | 2022.10.31 |
[BOJ] 18808. 스티커 붙이기 (0) | 2022.10.28 |
[BOJ] 15683. 감시 (0) | 2022.10.27 |
[BOJ] 3190. 뱀 (0) | 2022.10.24 |