주사위 굴리는걸 시뮬레이션 해보는, 삼성 냄새가 풀풀 풍기는 문제. 주사위를 굴렸을때 각 면이 어디로 이동하는지 알아두고, 그걸 코드로 바꿔주면 된다.
- 주사위를 굴렸을 때 지도의 숫자가 0이 아니면 주사위의 바닥면에 숫자를 복사하고, 지도의 값은 0으로 바꿔준다
- 주사위를 굴렸을 때 지도의 숫자가 0이면 주사위 바닥면의 숫자를 지도에 복사한다.
- 지도 범위를 벗어나려고 하는 명령은 무시하고 출력도 하지 않는다. 즉, 주사위를 굴리지 않는다.
이 조건, 특히 굵게 적어놓은 조건을 유의하면서 주사위를 굴려주면 된다. 그렇다면 주사위는 어떻게 굴러갈까?
- 동쪽(오른쪽) : 왼쪽 -> 윗면, 윗면 -> 오른쪽, 오른쪽 -> 바닥면, 바닥면 -> 왼쪽
- 서쪽(왼쪽) : 윗면 -> 왼쪽, 왼쪽 -> 바닥면, 바닥면 -> 오른쪽, 오른쪽 -> 윗면
- 북쪽: 윗면 -> 뒷면, 뒷면 -> 바닥면, 바닥면 -> 앞면, 앞면 -> 윗면
- 남쪽: 윗면 -> 앞면, 앞면 -> 바닥면, 바닥면 -> 뒷면, 뒷면 -> 윗면
이렇게 굴러간다고 머릿속으로 그려보고 이해하자. 여기서 동서쪽으로 굴릴 때는 앞뒷면이 변하지 않고, 남북으로 굴릴 때는 좌우면이 바뀌지 않는다는 것도 이해했다고 믿는다. 그럼 이제 코드를 짜 보자.
from sys import stdin
input = stdin.readline
N, M, x, y, K = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
# 0: 위, 1: 아래, 2: 앞, 3: 뒤, 4: 왼, 5: 오
dice = [0, 0, 0, 0, 0, 0]
order_list = list(map(int, input().split()))
for order in order_list:
if order == 1: # 동: 위->오, 오->아래, 아래->왼, 왼->위
if y+1 >= M:
continue
else:
up = dice[0]
down = dice[1]
left = dice[4]
right = dice[5]
dice[0] = left
dice[1] = right
dice[4] = down
dice[5] = up
y += 1
elif order == 2: # 서: 오른쪽->위, 위->왼쪽, 왼쪽->아래, 아래->오른쪽
if y-1 < 0:
continue
else:
up = dice[0]
down = dice[1]
left = dice[4]
right = dice[5]
dice[0] = right
dice[1] = left
dice[4] = up
dice[5] = down
y -= 1
elif order == 3: # 북 - 앞->위, 위->뒤, 뒤->아래, 아래->앞
if x-1 < 0:
continue
else:
up = dice[0]
down = dice[1]
front = dice[2]
rear = dice[3]
dice[0] = front
dice[1] = rear
dice[2] = down
dice[3] = up
x -= 1
elif order == 4: # 남 - 위->앞, 앞->아래, 아래->뒤, 뒤->위
if x+1 >= N:
continue
else:
up = dice[0]
down = dice[1]
front = dice[2]
rear = dice[3]
dice[0] = rear
dice[1] = front
dice[2] = up
dice[3] = down
x += 1
if graph[x][y] != 0:
dice[1] = graph[x][y]
graph[x][y] = 0
else:
graph[x][y] = dice[1]
print(dice[0])