뱀이 사과를 먹으면서 움직이는 게임에서, 방향 전환 타이밍을 주고 결과를 예측하는 문제이다.
고려했던 사항은 다음과 같다.
풀이 과정은 다음과 같다.
문제를 제대로 해석하지 못해서 오래 걸리고 힘들었다... 방향 전환, 사과의 위치(인덱스와 혼용), 시간초(0초부터 시작 VS 1초부터 시작)과 같이 문제를 오래 보고 읽어야 풀 수 있었다. 실제로 테스트에서 나왔다면 뼈대만 만들고 디버깅하면서 시간을 많이 허비할게 뻔하다. 문제를 제대로 읽는 연습을 해야겠다.
import sys
import collections
import pprint
def move():
global snake, di, dj
head, tail = snake[-1], snake[0]
nhi = head[0] + di
nhj = head[1] + dj
if nhi < 0 or nhi >= n or nhj < 0 or nhj >= n or (nhi, nhj) in list(snake)[:-1]:
return False
snake.append((nhi, nhj))
isApple = False
if board[nhi][nhj] == 1:
isApple = True
board[nhi][nhj] = -1
if not isApple:
board[tail[0]][tail[1]] = 0
snake.popleft()
return True
n = int(sys.stdin.readline().strip())
k = int(sys.stdin.readline().strip())
board = [[0 for _ in range(n)] for _ in range(n)]
for _ in range(k):
i, j = map(int, sys.stdin.readline().strip().split(' '))
board[i - 1][j - 1] = 1
l = int(sys.stdin.readline().strip())
rotates = collections.deque([])
for _ in range(l):
time, direction = sys.stdin.readline().strip().split(' ')
rotates.append((int(time), direction))
board[0][0] = -1
ds = {(0, 1): {'di': 0, 'dj': 1, 'L': (-1, 0), 'D': (1, 0)}, (1, 0): {'di': 1, 'dj': 0, 'L': (0, 1), 'D': (0, -1)}, (0, -1): {'di': 0, 'dj': -1, 'L': (1, 0), 'D': (-1, 0)}, (-1, 0): {'di': -1, 'dj': 0, 'L': (0, -1), 'D': (0, 1)}}
di = 0
dj = 1
snake = collections.deque([(0, 0)])
time = 0
while True:
time += 1
if not move():
print(time)
break
if len(rotates) > 0 and rotates[0][0] == time:
_, direction = rotates.popleft()
current = (di, dj)
di = ds[ds[current][direction]]['di']
dj = ds[ds[current][direction]]['dj']