Computer Science/알고리즘

[백준 - Python] 3190 - 뱀

바보1 2023. 10. 15. 14:39

0.  문제 링크

 

 

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

 

3190번: 뱀

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

www.acmicpc.net


1.  풀이 방법

 

 

  1. 나는 맵에다가 직접 뱀의 몸을 그려서 해결하였다.
  2. 사과가 있는 곳은 0, 뱀이 있는 곳은 1, 빈 공간은 -1로 처리하였다.
  3. dict를 사용해서 특정 시간의 뱀의 위치 전환을 표시했다. -> 0~3까지의 인덱스로 관리하였음. R이면 인덱스 += 1
  4. 뱀의 머리가 방향을 전환했다 하더라도, 꼬리는 나중에 전환하므로, 꼬리의 방향 전환을 위한 tailMove를 추가로 생성해 준다.
  5. tailMove에는 특정 위치에서 꼬리가 다음번에 이동해야 할 방향을 의미하는데, 꼬리가 특정 위치에 있다면 방향을 바꿔서 이동해 준다.
  6. 위 과정을 조건에 반복하면 된다.

2.  코드

 

 

import sys
input = sys.stdin.readline


if __name__ == "__main__":
    n = int(input())
    maps = [[-1] * n for _ in range(n)]
    maps[0][0] = 1      # snake

    k = int(input())
    for _ in range(k):
        y, x = map(int, input().split())
        maps[y - 1][x - 1] = 0      # 사과가 있음

    move = dict()
    l = int(input())
    for _ in range(l):
        sec, dir = input().split()
        move[int(sec)] = 1 if dir == 'D' else - 1

    tailMove = dict()
    dir = [[0, 1], [1, 0], [0, -1], [-1, 0]]
    headDir = 0
    tailDir = 0
    headY, headX = 0, 0
    tailY, tailX = 0, 0

    for sec in range(1, n ** 2):
        headY += dir[headDir][0]
        headX += dir[headDir][1]
        
        if not(0 <= headY < n and 0 <= headX < n):
            break

        headDir = (headDir + move.get(sec, 0)) % 4
        tailMove[(headY, headX)] = move.get(sec, 0)
        flag = maps[headY][headX]
            
        match flag:
            case -1:
                ## no apple, no snake
                maps[headY][headX] = 1      # 이제 뱀이 있음
                maps[tailY][tailX] = -1     # 꼬리 제거

                tailDir = (tailDir + tailMove.get((tailY, tailX), 0)) % 4        # 꼬리가 방향을 전환함
                tailY += dir[tailDir][0]
                tailX += dir[tailDir][1]
            case 0:
                ## apple
                maps[headY][headX] = 1      # 이제 뱀이 있음
            case 1:
                ## snake
                break

    print(sec)

3.  마무리