Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 3190 뱀

정글러 2021. 11. 15. 23:32
n = int(input())

apple = []
k = int(input())
for i in range(k) :
    y, x = map(int, input().split())
    apple.append([y, x])

order = []
l = int(input())
for i in range(l) :
    X, C = input().split()
    order.append([int(X), C])

right = [0, 1]
# down = [1, 0]
# left = [0, -1]
# up = [-1, 0]
def drift(d, lr) :
    if lr == 'D' :
        return [d[1], -d[0]]
    if lr == 'L' :
        return [-d[1], d[0]]

snake = [[1,1]]
direction = right
t = 0
while True :
    t = t + 1
    head = [snake[0][0] + direction[0], snake[0][1] + direction[1]]
    if head[0] == 0 or head[0] == n+1 or head[1] == 0 or head[1] == n+1 or head in snake :
        print(t)
        break
    snake.insert(0, head)
    if head in apple :
        apple.remove(head)
    else :
        del snake[-1]
    if [t, 'L'] in order :
        direction = drift(direction, 'L')
    if [t, 'D'] in order :
        direction = drift(direction, 'D')

입력받은 사과와 조종주문을 list로 저장해둔다.

진행방향 direction을 바꾸는 함수 drift를 정의한다.

snake는 매 시간 t마다 direction의 방향으로 1칸 움직인다.

이때 움직인 위치가 apple에 있다면 꼬리([-1])가 del되지 않는다.

행동을 마친 뒤 현재시각 t에 방향을 바꾸는 order가 있다면 방향을 바꾼다.

위를 반복하다가 움직인 위치가 맵 밖이거나 snake의 몸통일 때 t를 프린트하고 끝난다.