알고리즘

[BOJ] 3190번: 뱀 (파이썬)

김해리 2022. 4. 16. 10:15

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

 

3190번: 뱀

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

www.acmicpc.net


뱀과 사과의 정보를 2차원 행렬에서 관리하지 않고, 각각의 좌표들을 담고 있는 목록으로 관리하였습니다.

  • 뱀의 정보를 (y, x) 좌표의 목록 deque로 관리합니다
  • 사과 정보 역시 (y, x) 좌표의 목록 list로 관리합니다
  • 타이머를 증가시키며 아래의 조건에 따라 움직입니다
    • 현재 진행방향으로 움직여서 보드를 벗어나는 경우 종료
    • 현재 진행방향으로 움직여서 뱀을 만나는 경우 종료
    • 앞선 2개의 종료 조건을 통과하였다면, 뱀의 정보에 새로운 좌표를 추가합니다(뱀의 머리)
    • 새로운 좌표에 사과가 없다면, 뱀의 정보에서 마지막을 제거합니다(뱀의 꼬리)
    • 새로운 좌표에 사과가 있다면, 사과를 사과 목록에서 제거합니다
    • 현재 시점에 일어나는 방향 전환이 있다면 적용합니다

​* 행과 열을 y, x로 생각합니다

 

import sys
from collections import deque

n = int(sys.stdin.readline().rstrip())
k = int(sys.stdin.readline().rstrip())
apples = [tuple(map(int, sys.stdin.readline().rstrip().split())) for _ in range(k)]
l = int(sys.stdin.readline().rstrip())
moves = [sys.stdin.readline().rstrip().split() for _ in range(l)]

# right, down, left, up
direction = [(0, 1), (1, 0), (0, -1), (-1, 0)]
d = 0
y, x = 1, 1
snake = deque([(y, x)])
timer = 0

while True:
    timer += 1
    ny = y + direction[d][0]
    nx = x + direction[d][1]
    if ny < 1 or ny > n or nx < 1 or nx > n:
        break
    if (ny, nx) in snake:
        break
    snake.appendleft((ny, nx))
    if (ny, nx) not in apples:
        snake.pop()
    else:
        apples.remove((ny, nx))
    for m in moves:
        if int(m[0]) == timer:
            if m[1] == "D":
                d = (d + 1) % 4
            else:
                d = (d - 1) % 4
    y, x = ny, nx

print(timer)

* 예제 입력에 대한 정답에는 이상이 없었으나, 제출 결과가 "틀렸습니다"였습니다. 아래의 링크에 있는 테스트 케이스를 통해 이미 먹은 사과에 대한 처리가 필요하다는 사실을 깨달아 코드를 추가하였습니다.

    else:
        apples.remove((ny, nx))

https://www.acmicpc.net/board/view/40546

 

글 읽기 - 3190번 뱀문제 완성했는데 어디가 틀린지 모르겠습니다..

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

반응형