////
Search

소스코드

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문 바깥에서 시간값을 출력하면 끝!!