계획
- 구현
- map_lst를 만듦. 일반은 0, 사과 있으면 1
- 방향을 0, 1, 2, 3으로 두고, dx, dy로 이동 계산
- 뱀 길이는 queue로 처리
- 사과 먹으면 먹은 자리는 0으로 바꾸고, 뱀은 append, popleft 함
- 사과 없으면 이동
- 꼬리가 줄어들기 전에 머리가 이동
- 해당 위치에 몸통이 있는지 먼저 확인 후, append 진행
- 처음 시작부터 시간이 X만큼 지난 후에 방향 전환
- 자기랑 충돌 또는 맵 밖으로 나가면 게임 끝
- 마지막 방향 전환까지 살았으면, 맵 끝으로 갈 때까지 직진
import sys
from collections import deque
sys.stdin = open("input.txt")
input = sys.stdin.readline
N = int(input())
K = int(input())
map_lst = []
for _ in range(N):
map_lst.append([0] * N)
for _ in range(K):
y, x = map(int, input().split())
map_lst[y-1][x-1] = 1
queue = deque([[0, 0]])
direct = 0 # 보는 방향 0우 1하 2좌 3상
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
time = 0
L = int(input())
for _ in range(L):
X, C = input().split()
X = int(X)
for _ in range(X - time):
time += 1
# print("direct", direct, queue)
if [queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]] in queue:
print(time)
exit()
queue.append([queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]])
if queue[-1][0] < 0 or queue[-1][1] < 0 or queue[-1][0] >= N or queue[-1][1] >= N:
print(time)
exit()
if map_lst[queue[-1][1]][queue[-1][0]] == 1: # 사과 먹으면
map_lst[queue[-1][1]][queue[-1][0]] = 0
else:
queue.popleft()
# 방향 전환
if C == "D":
direct = (direct + 1) % 4
elif C == "L":
direct = direct - 1
if direct < 0:
direct += 4
# 마지막 방향 전환 후 직진
while True:
time += 1
queue.append([queue[-1][0] + dx[direct], queue[-1][1] + dy[direct]])
if queue[-1][0] < 0 or queue[-1][1] < 0 or queue[-1][0] >= N or queue[-1][1] >= N:
print(time)
exit()
if map_lst[queue[-1][1]][queue[-1][0]] == 1: # 사과 먹으면
map_lst[queue[-1][1]][queue[-1][0]] = 0
continue
a = queue.popleft()
if a in queue:
print(time)
exit()
- 사과 위치 인덱스가 0부터가 아닌 1부터 시작함
- 사과 위치가 행, 열 순서로 주어짐