

N = int(input()) # 보드의 크기
K = int(input()) # 사과의 개수
# 사과의 위치
apples = set()
for _ in range(K):
a, b = map(int, input().split())
apples.add((a - 1, b - 1))
L = int(input()) # 뱀의 방향변환 정보
comm_queue = deque() # 모든 방향변환 정보를 담은 큐
# 시간 및 명령
for _ in range(L):
# 방향이 바뀌는 시간 및 시계/반시계 여부
time, command = input().split()
comm_queue.append((int(time), command))
set으로 관리하도록 하겠습니다.x행 y열에 도착했을 때, if (x, y) in apples을 이용해 사과의 존재 여부를 확인할 수 있습니다.(a - 1, b - 1)로 빼 줘야 합니다.comm_queue[0]을 이용해 방향을 바꿀 시간을 확인하고, 아직 안 됐으면 놔두고, 바꿀 시간이 됐을 때만 꺼내면 됩니다.# 뱀 위치 이동
def gameplay():
curr_time = 0 # 지금 몇 초?
head_x = 0 # 머리의 위치 - 몇행?
head_y = 0 # 머리의 위치 - 몇열?
# 현재 뱀이 존재하는 칸의 모든 좌표
snake_queue = deque([(0, 0)])
# 이동 방향 (순서대로 우 -> 하 -> 좌 -> 상)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
face = 0 # 우회전이면 +1, 좌회전이면 -1
# 하단코드에 계속

curr_time은 게임의 경과 초, head_x 및 head_y는 뱀의 머리의 좌표입니다.snake_queue는 현재 뱀이 존재하는 칸의 모든 좌표를 담는 큐입니다.1이며 (0, 0) 칸에 위치해 있기 때문에, 원소는 (0, 0)만 두면 됩니다.(행, 열) 튜플을 인큐할 거고,
dx, dy 리스트는 뱀이 다음으로 이동할 칸을 계산하는 데 사용합니다.face에 따라 뱀이 쳐다보는 방향이 달라집니다.face가 1 증가(우 -> 하 -> 좌 -> 상)하고, 좌회전하면 1 감소(우 -> 상 -> 좌 -> 하)하도록 구현합니다.# 게임이 언제 끝나는지 반환
def gameplay():
# 위 코드에서 이어짐
while True:
curr_time += 1
# 뱀 위치 이동
nx, ny = head_x + dx[face], head_y + dy[face]
if nx < 0 or N <= nx or ny < 0 or N <= ny:
return curr_time # 벽에 부딪힘 -> 게임 끝!
if (nx, ny) in snake_queue:
return curr_time # 뱀에 부딪힘 -> 게임 끝!
snake_queue.append((nx, ny)) # 머리의 위치를 큐에 추가
head_x, head_y = nx, ny
# 사과가 있는 경우
if (head_x, head_y) in apples:
apples.remove((head_x, head_y))
else:
snake_queue.popleft() # 꼬리의 위치를 큐에서 빼기
# 시간이 된 경우, 방향을 회전한다
if comm_queue and comm_queue[0][0] == curr_time:
command = comm_queue.popleft()[1]
if command == "L": # 좌회전
face = (face - 1) % 4
else: # 우회전
face = (face + 1) % 4
while True를 이용해 게임을 구현하겠습니다. 1초가 지날 때마다 while문을 1번 돌게 됩니다.curr_time += 1로 시간을 재는 중입니다.1. 뱀 움직이기
nx, ny를 구합니다.face에 따라 바라보는 위치가 달라짐에 유의하세요.nx, ny가 범위를 벗어나면, 벽에 부딪혀 게임이 끝납니다.(nx, ny)가 자기자신의 몸과 부딪히면, 게임이 끝납니다.snake_queue에 (nx, ny) 좌표가 존재하는지 확인하면 됩니다.head_x, head_y를 nx, ny로 갱신합니다.snake_queue에 넣는 것도 잊지 말아야 합니다2. 사과 여부 확인하기

snake_queue에서 디큐를 하면, 제일 먼저 방문한 칸을 꺼낼 수 있겠죠!snake_queue.popleft() 메서드로 해 주면 됩니다.apples 집합에서 해당 좌표를 삭제합니다..popleft() 하지 않습니다.3. 회전하기
comm_queue의 맨 앞 원소를 확인해, 회전할 시간이 됐는지 확입니다.comm_queue에서 값을 꺼냅니다.dx, dy 리스트의 길이가 4였으니, 4의 나머지로 구해야 인덱스를 벗어나지 않습니다.4. 무한반복
from collections import deque
import sys
input = sys.stdin.readline
N = int(input()) # 보드의 크기
K = int(input()) # 사과의 개수
# 사과의 위치
apples = set()
for _ in range(K):
a, b = map(int, input().split())
apples.add((a - 1, b - 1))
L = int(input()) # 뱀의 방향변환 정보
comm_queue = deque() # 모든 방향변환 정보를 담은 큐
# 시간 및 명령
for _ in range(L):
time, command = input().split()
comm_queue.append((int(time), command))
# 게임이 언제 끝나는지 반환
def gameplay():
curr_time = 0 # 지금 몇 초?
head_x = 0 # 머리의 위치 - 몇행?
head_y = 0 # 머리의 위치 - 몇열?
# 현재 뱀이 존재하는 칸의 모든 좌표
snake_queue = deque([(0, 0)])
# 이동 방향 (순서대로 우 -> 하 -> 좌 -> 상)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
face = 0 # 우회전이면 +1, 좌회전이면 -1
while True:
curr_time += 1
# 뱀 위치 이동
nx, ny = head_x + dx[face], head_y + dy[face]
if nx < 0 or N <= nx or ny < 0 or N <= ny:
return curr_time # 벽에 부딪힘 -> 게임 끝!
if (nx, ny) in snake_queue:
return curr_time # 뱀에 부딪힘 -> 게임 끝!
snake_queue.append((nx, ny)) # 머리의 위치를 큐에 추가
head_x, head_y = nx, ny
# 사과가 있는 경우
if (head_x, head_y) in apples:
apples.remove((head_x, head_y))
else:
snake_queue.popleft() # 꼬리의 위치를 큐에서 빼기
# 시간이 된 경우, 방향을 회전한다
if comm_queue and comm_queue[0][0] == curr_time:
command = comm_queue.popleft()[1]
if command == "L":
face = (face - 1) % 4
else:
face = (face + 1) % 4
print(gameplay())
if (nx, ny) in snake_queue에서 큐의 원소를 순회