https://www.acmicpc.net/problem/3190
"""
"""
from sys import stdin
input = stdin.readline
n = int(input()) # 보드의 크기
k = int(input()) # 사과의 개수
pan = [ [0] * n for _ in range(n) ]
for _ in range(k): # 사과의 개수만큼 좌표를 입력받아 사과(1)로 기록한다.
a, b = map(int, input().split())
pan[a-1][b-1] = 1
pan[0][0] = 2 # 뱀의 출발위치는 (0, 0)으로 뱀(2)로 기록한다.
l = int(input())
snake_dir = []
for _ in range(l): # 뱀이 시간마다 어디로 이동하는지 기록한다.
a, b = input().split()
snake_dir.append((int(a), b))
dx, dy = [0, 1, 0, -1], [1, 0, -1, 0] # 동, 남, 서, 북 ('D'이면 +1, 'L'이면 -1하면 방향이 적절하게 설정된다.)
time = 0 # 시간
k = 0 # 방향을 정할 변수
x, y = 0, 0 # 뱀의 시작 좌표
mx, my = 0, 0 # 뱀의 다음 좌표
tail_xy = [] # 뱀의 길이가 늘어남에 따른 뱀의 꼬리 부분 좌표
while True:
if snake_dir: # 만약 뱀이 이동할 방향이 있다면
if time == snake_dir[0][0]: # 현재 시간과 뱀이 X초 후 움직일 시간이 일치 한다면 방향을 수정한다.
if snake_dir[0][1] == 'D':
k += 1
else:
k -= 1
mx = x + dx[k % 4]
my = y + dy[k % 4]
snake_dir.pop(0)
else: # 시간이 일치하지 않는다면 방향을 수정하지 말고 직진하도록 한다.
mx = x + dx[k % 4]
my = y + dy[k % 4]
else: # 뱀이 더 이상 이동할 필요가 없다면 방향은 바뀌지 않고 직진만 한다.
mx = x + dx[k % 4]
my = y + dy[k % 4]
time += 1
if mx < 0 or n <= mx or my < 0 or n <= my: # 벽을 만난다면 게임이 끝난다.
break
elif pan[mx][my] == 2: # 자기 자신과 부딪힌다면 게임이 끝난다.
break
elif pan[mx][my] == 1: # 사과가 있다면 뱀의 길이를 늘린다. (이때, 뱀의 꼬리 좌표를 기록한다.)
pan[mx][my] = 2
tail_xy.append((x, y))
elif pan[mx][my] == 0: # 빈 공간이라면 뱀을 이동시킨다. (이때, 뱀의 꼬리 좌표를 기록한다.)
pan[mx][my] = 2
tail_xy.append((x, y))
if tail_xy: # 뱀의 크기가 2 이상이라면 꼬리 부분을 0으로 바꾸고 뱀을 이동시킨다.
pan[tail_xy[0][0]][tail_xy[0][1]] = 0 # 0번째 인덱스가 꼬리 부분이라고 할 수 있다.
tail_xy.pop(0)
else: # 뱀의 크기가 1 이라면 현재 위치를 0으로 바꾸고 뱀을 이동시킨다.
pan[x][y] = 0
x, y = mx, my # 현재 위치를 다음 위치로 갱신하고 끝낸다.
print(time)
문제 설명 그대로 구현하면 되는데 변수가 많아서 조금 헷갈린다.
가장 핵심은 뱀이 이동할때 꼬리 좌표를 기록하는 변수를 두는것이 아닌가 싶음