'Dummy'라는 도스 게임이 있습니다. 이 게임에는 뱀이 나와서 기어 다니는데, 사과를 먹으면 뱀 길이가 늘어납니다. 뱀이 이리저리 기어 다니다가 벽 또는 자기 자신의 몸과 부딪히면 게임이 끝납니다. 게임은 N x N 정사각 보드 위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있습니다. 보드의 상하좌우 끝에는 벽이 있습니다. 게임을 시작할 때 뱀은 맨 위 맨 좌측에 위치하고 뱀의 길이는 1입니다. 뱀은 처음에 오른쪽을 향합니다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따릅니다.
이 문제는 전형적인 시뮬레이션 문제 유형으로, 문제에서 요구하는 대로 구현해낼 수 있다면 정답 판정을 받을 수 있다. 2차원 배열상의 맵에서 뱀이 이동하도록 해야 하므로 2차원 배열상의 특정 위치에서 동, 남, 서, 북의 위치로 이동하는 기능을 구현해야 한다. 이 문제의 경우, 뱀이 처음에 오른쪽(동쪽)을 바라보고 있다는 점을 고려하자. 더불어 뱀의 머리가 뱀의 몸에 닿는 경우에도 종료해야 하므로, 매 시점마다 뱀이 존재하는 위치를 항상 2차원 리스트에 기록해야 한다.
n = int(input())
k = int(input())
graph = [[0] * (n+1) for _ in range(n+1)] # 맵 정보
# 맵 정보 (사과가 있는 곳은 1로 표시)
for _ in range(k):
a, b = map(int, input().split())
graph[a][b] = 1
info = [] # 방향 회전 정보
# 방향 회전 정보 입력
l = int(input())
for _ in range(l):
x, c = map(str, input().split())
info.append((int(x), c))
# 처음에는 오른쪽을 보고 있으므로 (동, 남, 서, 북)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
def turn(direction, c):
if c == 'L':
direction = (direction-1)%4
else:
direction = (direction+1)%4
return direction
def simulate():
x, y = 1, 1 # 뱀의 머리 위치
graph[x][y] = 2 # 뱀이 존재하는 위치는 2로 표시
direction = 0 # 처음에는 동쪽을 보고 있음
time = 0 # 시작한 뒤에 지난 '초' 시간
index = 0 # 다음에 회전할 정보
q = [(x, y)] # 뱀이 차지하고 있는 위치 정보
while True:
nx = x + dx[direction]
ny = y + dy[direction]
# 맵 범위 안에 있고, 뱀의 몸통이 없는 위치라면
if 1<=nx and nx<=n and 1<=ny and ny<=n and graph[nx][ny] != 2:
# 사과가 없다면 이동 후에 꼬리 제거
if graph[nx][ny] == 0:
graph[nx][ny] = 2
q.append((nx, ny))
px, py = q.pop(0)
graph[px][py] = 0
# 사과가 있다면 이동 후에 꼬리 그대로 두기
if graph[nx][ny] == 1:
graph[nx][ny] = 2
q.append((nx, ny))
# 벽이나 뱀의 몸통과 부딪혔다면
else:
time += 1
break
x, y = nx, ny # 다음 위치로 머리를 이동
time += 1
# 회전할 시간인 경우 회전
if index < l and time == info[index][0]:
direction = turn(direction, info[index][1])
index += 1
return time
print(simulate())