:pencil2:코드

import sys
# sys.stdin = open("input.txt")
input = sys.stdin.readline
from collections import deque


n = int(input())    # 보드 크기
K = int(input())    # 사과 개수
apple = [list(map(int, input().rstrip().split())) for _ in range(K)]

L = int(input())    # 방향 변환 정보
direction = deque()
for _ in range(L):
    a, b = input().rstrip().split()
    direction.append((int(a), b))

arr = [[0] * n for _ in range(n)]
for x, y in apple:
    arr[x - 1][y - 1] = 2

q = deque()
q.append((0, 0))
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
idx = 1
cnt = 0
arr[0][0] = 1

while q:
    r, c = q[-1][0], q[-1][1]
    nr, nc = r + dr[idx], c + dc[idx]
    cnt += 1
    if 0 <= nr < n and 0 <= nc < n:
        if arr[nr][nc] == 1:    # 자기 몸과 만나는 경우
            print(cnt)
            exit()
        q.append((nr, nc))
        if arr[nr][nc] == 2:    # 사과 먹은 경우
            arr[nr][nc] = 1 
        elif arr[nr][nc] == 0:  # 빈 곳이라면  
            arr[nr][nc] = 1
            a, b = q.popleft()  # 꼬리 자르기
            arr[a][b] = 0
    else:                       # 벽인 경우
        print(cnt)
        exit()

    if direction:
        if cnt == direction[0][0]:
            if direction[0][1] == "D":
                idx = (idx + 1) % 4
            else:
                idx = (idx - 1) % 4
            direction.popleft()

print(cnt)

:star:풀이

뱀의 몸을 큐에다 기록하면서 순서대로 구현하면된다.

벽에 부딪히거나(배열 범위를 벗어나는 경우) 자기 몸과 만나는 경우에는 종료시켜준다.

그 외의 경우에는 일단 몸을 늘려준 뒤에 사과랑 만난 경우에는 몸의 길이를 유지하고 사과가 없다면 큐의 맨 앞부분을 팝해준다.

방향의 경우에는 뱀이 움직이는 시간을 기록하면서 해당 시간이 방향 배열에 들어있으면 방향을 틀어주면된당!

댓글남기기