여름의 서재

[백준] 3190_뱀 본문

알고리즘/BOJ

[백준] 3190_뱀

엉아_ 2021. 10. 30. 00:40
728x90

📕 문제

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

 

3190번: 뱀

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

www.acmicpc.net

 

💡 풀이법

1. 사과 좌표 정보를 리스트로 만들고, 방향을 바꾸는 정보들을 덱으로 만들어준다.

2. snakes 라는 리스트를 만드는데 뱀의 몸이 위치한 좌표들이 담기게 된다.

3. while문을 돌며 시간이 1초씩 흐르면서 뱀의 머리가 향하는 좌표를 구해주고, 벽을 만나거나 자기 자신의 몸과 부딛히면 break를 한다. 그렇지 않으면 새로 구한 좌표를 snakes 리스트의 앞에 담아준다.

4. 만약 위에서 구한 좌표가 사과의 좌표와 일치한다면 해당 사과를 리스트에서 빼준다. 그렇지 않다면 snakes의 마지막 원소(뱀의 꼬리)를 pop 해준다

5. 방향을 바꿀 시간이 됬다면 방향을 바꿔준다.

 

from collections import deque

N = int(input())
K = int(input())
apples = [tuple(map(int, input().split())) for _ in range(K)]
L = int(input())
directions = deque([input().split() for _ in range(L)])

i = 0
dx, dy = 0, 1
t, c = directions.popleft()
t = int(t)
snakes = deque([(1,1)])  # 뱀의 몸이 위치한 좌표가 들어갈 deque
while True:
    i += 1
    nx, ny = snakes[0][0] + dx, snakes[0][1] + dy

    if nx < 1 or nx >= N+1 or ny < 1 or ny >= N+1 or (nx, ny) in snakes:  # 벽처리
        break
    else:
        snakes.appendleft((nx, ny))

    if (nx, ny) in apples:  # 그 자리에 사과가 있다면 사과 삭제
        apples.remove((nx, ny))
    else:
       snakes.pop()  # 없다면 꼬리 있던 좌표 삭제

    if i == t:  # 방향을 바꿀 시간이 됬다면
        if c == 'L':
            dx, dy = -dy, dx
        else:
            dx, dy = dy, -dx
        if directions:  # 방향을 바꿀게 아직 남아있다면 t, c 변경
            t, c = directions.popleft()
            t = int(t)
print(i)
Comments