이번 문제는 삼성 기출 문제로, 큐를 사용하여 쉽게 해결하였다. 문제에서 주어진대로 다음 위치 인덱스를 범위에 들어갈 경우에 구하고, 해당 인덱스가 뱀의 인덱스를 나타내는 tail 큐에 들어있을 경우 result+1을 반환하고, 그렇지 않다면 다음 위치를 tail에 넣어준다. 만약 그 위치에 사과가 있을 경우, 넘어가고, 사과가 있지 않을 경우, tail을 leftpop()해준다. 사과는 먹었으므로, 격자 상에서의 사과를 없애준다. 이 과정을 반복하다가 다음 위치가 범위 밖일 경우 result+1을 반환한다.
grid[r-1][c-1]
을 2로 갱신한다.[sys.maxsize, '']
을 넣어준다.(y, x)
를 넣는다.com[0]
까지 반복하는 i에 대한 for문을 돌린다.tail[-1][0]+dy[d]
, tail[-1][1]+dx[d]
로 선언한다.grid[ny][nx]
가 2가 아닐 경우,grid[ny][nx]
를 0으로 갱신한다.com[1]
이 L일 경우,(d+3)%4
로 갱신한다.com[1]
이 D일 경우,(d+1)%4
로 갱신한다.move(0, 0, 0)
의 반환값으로 선언한다.import collections
import sys
n=int(input())
k=int(input())
grid=[[0 for _ in range(n)] for _ in range(n)]
for _ in range(k):
r, c=map(int, input().split())
grid[r-1][c-1]=2
l=int(input())
command=[list(map(str, input().split())) for _ in range(l)]
for i in range(l-1, 0, -1):
command[i][0]=int(command[i][0])-int(command[i-1][0])
command.append([sys.maxsize, ''])
dy, dx=[0, 1, 0, -1], [1, 0, -1, 0]
def move(y, x, d):
result=0
tail=collections.deque()
tail.append((y, x))
for com in command:
for i in range(1, int(com[0])+1):
ny, nx=tail[-1][0]+dy[d], tail[-1][1]+dx[d]
if 0<=ny<n and 0<=nx<n:
if (ny, nx) in tail:
return result+1
tail.append((ny, nx))
if grid[ny][nx]!=2:
tail.popleft()
else:
grid[ny][nx]=0
result+=1
else:
return result+1
if com[1]=='L':
d=(d+3)%4
elif com[1]=='D':
d=(d+1)%4
return result+1
answer=move(0, 0, 0)
print(answer)