https://www.acmicpc.net/problem/3190
시간 1초, 메모리 128MB
input :
output :
조건 :
사과를 먹으면 뱀 길이가 늘어난다.
뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.
게임이 끝나려면 뱀이 N * N을 벗어나거나 자기 자신을 건드리는 경우이다.
이를 통해 반복문의 조건을 생성할 수 있다. 다음 이동하는 위치에 본인의 몸이 있거나 그게 보드의 외부인 경우.
다음 날짜에 이동하는 위치를 가지고 조건문을 만들기 때문에 그 날짜에 게임이 끝나게 된다.
고로 건드릴 것이 더이상 없다.
생각해줘야 할 것 2가지 중에 하나가 방향인데 이를 위해 리스트에 초를 기준으로 내림차순해서 정렬을 했다.
pop을 하는 것이 더 빠를거니까 내림차순으로 정렬했다.
그러고 이동을 한 다음에 방향을 바꾸기 때문에 방향을 바꾸고 이동을 한다고 보면 된다.
이 방향을 맞추기 위해 dx, dy를 잘 맞춰주면 된다. 시작할 떄는 오른 쪽으로 보고 있으니까 (1, 0)을 나타낸다고 보고 여기서 오른쪽으로 방향을 돌린다면 (0, 1) 왼쪽이라면 (0, -1)로 이동을 한다. 이것을 인덱스를 통해 나타내자.
여기서 인덱스 에러를 조심해야 하는데 길이가 4라서 나머지를 이용하는 것이 편하다.
이게 제일 중요하다. 리스트에 각 좌표를 찍고 이동을 해야 하나 싶었는데 그냥 뱀의 머리만을 잘 나타내도록 하면서 리스트에 좌표들을 저장하자.
뱀이 위치하는 곳의 값을 2로 저장하도록 하고 그냥 이동을 하는 경우에는 가장 앞에 위치하는 꼬리를 삭제하고 머리가 새로 이동하는 위치를 추가하도록 하자.
이를 통해 아주 편하게 나타낼 수 있다.
import sys
def direction_change(to):
global idx
idx += to
idx %= 4
n = int(sys.stdin.readline())
graph, direction = [[0] * n for _ in range(n)], []
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
for i in range(int(sys.stdin.readline())):
a, b = map(int, sys.stdin.readline().split())
graph[a - 1][b - 1] = 1
for i in range(int(sys.stdin.readline())):
a, b = sys.stdin.readline().split()
direction.append((int(a), b))
direction.sort(key=lambda x:-x[0])
x, y, idx, day = 0, 0, 0, 0
body = [(x, y)]
while x >= 0 and x < n and y >= 0 and y < n and graph[x][y] != 2:
if direction and day == direction[-1][0]:
temp = direction.pop()
if temp[1] == 'D':
direction_change(1)
else:
direction_change(-1)
if graph[x][y] == 0:
head = body.pop(0)
graph[head[0]][head[1]] = 0
if graph[x][y] != 2:
body.append((x, y))
graph[x][y] = 2
x += dx[idx]
y += dy[idx]
day += 1
print(day)