백준 #3190 뱀
코드
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)
풀이
뱀의 몸을 큐에다 기록하면서 순서대로 구현하면된다.
벽에 부딪히거나(배열 범위를 벗어나는 경우) 자기 몸과 만나는 경우에는 종료시켜준다.
그 외의 경우에는 일단 몸을 늘려준 뒤에 사과랑 만난 경우에는 몸의 길이를 유지하고 사과가 없다면 큐의 맨 앞부분을 팝해준다.
방향의 경우에는 뱀이 움직이는 시간을 기록하면서 해당 시간이 방향 배열에 들어있으면 방향을 틀어주면된당!
댓글남기기