소스코드
import sys
from collections import deque
input = sys.stdin.readline
N = int(input().strip())
K = int(input().strip())
graph = [[0] * N for _ in range(N)]
for _ in range(K):
row, col = map(int, input().strip().split())
graph[row-1][col-1] = 2 # 그래프 상의 2는 사과가 있음을 의미, 1은 뱀\
L = int(input().strip())
directions = {}
for _ in range(L):
t, d = input().strip().split()
directions[int(t)] = d
# 주요 로직 시작
queue = deque([(0,0)])
graph[0][0] = 1 # 시작 위치
time = 0 # 결과
# 이동방향 : 동남서북
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
move_idx = 0
while True:
# 시간 증가
time += 1
# 현재와 다음 위치 좌표 계산
current_row, current_col = queue[-1]
next_row, next_col = current_row + dx[move_idx], current_col + dy[move_idx]
if 0 <= next_row < N and 0 <= next_col < N and graph[next_row][next_col] != 1:
# 사과가 존재하지 않는 경우 -> 꼬리도 움직임
if graph[next_row][next_col] != 2:
tail_row, tail_col = queue.popleft() # 꼬리 꺼내기
graph[tail_row][tail_col] = 0
# 사과가 있든 없든 머리는 움직임
queue.append((next_row, next_col)) # 머리 위치는 큐에 삽입
graph[next_row][next_col] = 1
# 방향 전환할 시간인지 확인하고 적용
if time in directions:
if directions[time] == 'L':
move_idx = (move_idx - 1) % 4
else:
move_idx = (move_idx + 1) % 4
else:
break
# 결과 출력
print(time)
Python
복사
풀이
•
2차원 리스트로 맵을 표현해야겠다는 생각은 다들 하셨을겁니다.
•
뱀의 위치를 매초 추가하고 꼬리는 머리가 지나갔던 자리 중 맨 앞을 빼야하기 때문에 다른 자료구조보다 큐가 필요하다고 생각했습니다.
•
매초 방향 전환이 있는지 없는지 체크해야하기 때문에 배열(리스트)보다는 딕셔너리로 곧바로 액세스하는게 좋을 것 같다고 생각했습니다.
•
게임의 진행 로직은 다음과 같습니다 :
◦
매초 시간 증가
◦
다음 좌표값이 맵 안에 있고 몸과 충돌하지 않으면 다음 로직 진행(그게 아니면 게임종료)
▪
사과가 없으면 꼬리의 좌표를 큐에서 popleft
•
사과가 있든 없든 머리 좌표는 큐에 append
▪
방향 전환을 해야하는 타이밍이면 L인지 C인지에 따라 움직이는 방향의 인덱스를 갱신
•
동남서북 4개의 인덱스로 이동할 방향의 값을 표현
•
while문 바깥에서 시간값을 출력하면 끝!!
