Algorithm/boj

[파이썬] 3190 뱀

takeU 2022. 11. 1. 19:17
반응형
from collections import deque

n, k = int(input()), int(input())
board = [[0] * n for _ in range(n)]
for _ in range(k):
    x, y = map(int, input().split())
    board[x - 1][y - 1] = 1

dx, dy = [0, 1, 0, -1], [1, 0, -1, 0]
d, time = 0, 1
snake = deque([[0, 0]])
x, y = 0, 0

l = int(input())
rule = deque([input().split() for _ in range(l)])

while True:
    x, y = x + dx[d], y + dy[d]
    if [x, y] in snake or x in [-1, n] or y in [-1, n]:
        print(time)
        break
    snake.append([x, y])
    if board[x][y]:
        board[x][y] = 0
    else:
        snake.popleft()
    if rule and int(rule[0][0]) == time:
        cur, turn = rule.popleft()
        if turn == 'L':
            d = (d - 1) % 4
        else:
            d = (d + 1) % 4
    time += 1

큐 + 시뮬레이션

1. 보드 생성 후 사과 위치 1로 표시

2. 반복문을 돌며 사과가 있으면 해당 좌표의 보드를 0으로 바꿔주고, 없으면 새로운 좌표를 append, 기존 꼬리 popleft

3. time과 룰의 0번째 인덱스 시간이 같은 경우 회전 

 

종료조건 

1. 자기 자신과 박치기 - snake에 움직여야하는 다음 좌표가 포함되어 있을 때

2. 벽에 박치기 - 다음 좌표의 x, y 값중 하나라도 -1이나 n인 경우