사과를 먹으면 꼬리(마지막)와 머리(처음)를 grid에서 뱀의 몸통이 있다고 표시해준다.
만약 사과가 없다면 머리만 표시해준다. (몸이 커지지 않아 꼬리 부분은 이동 때문에 더이상 뱀이 차지하고 있지 않음)
이 과정을 반복하며 입력 받은 시간마다 방향전환 리스트를 참고해 그 시간에 도달하면 방향을 전환해준다.
큐를 통해 위와 같은 과정을 반복할 수 있다.
만약 사과가 없다면 꼬리 부분은 없애준다.(큐에서 맨 왼쪽 값)
그리고 현재 머리가 위치한 부분은 1로 표시해 주며 큐에도 값을 넣어준다.
방향전환이 필요하다면 방향전환을 해준다.
방향은 처음엔 0으로 설정해주고, 값이 들어올때마다 다음과 같은 식으로 변경해주면 된다.
def turnDirection(direc, C):
if C == 'L':
return (direc - 1) % 4
else:
return (direc + 1) % 4
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
dx, dy를 다음과 같은 형식으로 설정해주었기 때문에 왼, 오, 위, 아래
dx, dy의 경우는 다음과 같이 설정해준다.(방향에 맞춘 값들)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
#백준, 3190 뱀
from collections import deque
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
N = int(input())
K = int(input())
grid = [[0]*(N+1) for i in range(N+1)]
directions = {}
for i in range(K):
x, y = map(int, input().split())
grid[x][y] = 2
L = int(input())
for i in range(L):
X, C = input().split()
directions[int(X)] = C
x, y = 1, 1
cnt = 0
direc = 0
grid[1][1] = 1
Q = deque()
Q.append((1, 1))
def turnDirection(direc, C):
if C == 'L':
return (direc - 1) % 4
else:
return (direc + 1) % 4
while True:
cnt += 1
x += dx[direc]
y += dy[direc]
if x > N or y > N or x <= 0 or y <= 0:
break
if grid[x][y] == 1:
break
elif grid[x][y] == 0:
bx, by = Q.popleft()
grid[bx][by] = 0
grid[x][y] = 1
Q.append((x, y))
if cnt in directions:
direc = turnDirection(direc, directions[cnt])
print(cnt)
처음에 헷갈렸던게 그저 뱀을 그리드에 채우는 형식으로 생각하면 되는 것을 뱀이 움직이다고 생각하여 매번 그리드를 갱신해줘야겠구나 착각하였다. 근데 그저 꼬리와 머리만 1 또는 0으로 설정해주고 방향마다 바꿔주면 되는 문제였다... 큐를 사용해서 어떻게 활용하지를 좀 더 생각했다면 쉽게 풀었을 것 같다. 아쉽다.