반응형

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

해결 방법 : Linked List

  • board가 (2 <= N <= 100)이고 최대 second가 10,000밖에 되지 않기 때문에 최대 10,100초 안에 답이 나온다. 따라서 1초 마다 뱀이 움직이는 것을 그대로 구현하였다.
  • 뱀은 연결 리스트로 표현된다. 현재 sec에 이동한 칸은 리스트의 head에, 꼬리의 끝은 리스트의 tail이 될 것이다.
  • 사과를 먹으면 해당 sec에는 tail을 감소시키지 않는다.
  • 방향 전환은 시간은 순서대로 있으므로 방향 전환 정보를 담은 배열의 0번째만 참조한다.
  • board 범위를 벗어나거나, 뱀을 표현한 연결 리스트안에 있는 좌표쌍에 들어가게 되면 종료. 

 

import sys
input = sys.stdin.readline
from collections import deque

def solution(N, apples, rotates):
    D = {(0,1) : ((1,0),(-1,0)), (1,0) : ((0,-1),(0,1)),
         (0,-1) : ((-1,0),(1,0)), (-1,0) : ((0,1),(0,-1))} # 방향 전환 
    Q = deque([(0,0)]) # linked list로 사용
    sec, d = 0, (0,1) # 처음 시작, 처음 방향(Right)
    while True:
        sec += 1
        r, c = Q[-1][0] + d[0], Q[-1][1] + d[1] # 이동한 좌표 row, col
        
        if not (0 <= r < N and 0 <= c < N) or (r, c) in Q: # board 이탈 or 몸통박치기
            return sec
        
        Q.append((r, c)) # 머리 추가

        if (r+1, c+1) not in apples: # 꼬리 제거
            Q.popleft()
        else:
            apples.remove((r+1, c+1)) # 먹은 사과 제거
        
        if rotates: # 방향 전환
            if rotates[0][0] == str(sec):
                d = D[d][0] if rotates.pop(0)[1] == 'D' else D[d][1]


if __name__ == '__main__':
    N = int(input())
    K = int(input())
    apples = [tuple(map(int, input().split())) for _ in range(K)]
    L = int(input())
    rotates = [tuple(input().split()) for _ in range(L)]
    result = solution(N, apples, rotates)
    print(result)
반응형

+ Recent posts