[Python] 백준 3190번: 뱀

민정·2024년 4월 8일

변수

  1. 뱀이 위치한 좌표를 snake 리스트에 저장
  2. 사과가 위치한 좌표를 apple 리스트에 저장
  3. 회전 정보를 dict 형태로 저장
  4. dx와 dy를 ->로 이동하면 오른쪽 90도, <-로 이동하면 왼쪽 90도 회전한 방향이 되도록 정의

로직

  1. d 방향으로 한 칸 이동한 새로운 좌표 (nx, ny)에 대해서
    1. (nx, ny) 위치에 벽이 있으면 → break
    2. (nx, ny) 위치에 뱀의 일부가 있으면 → break
    3. (nx, ny) 위치에 사과가 있으면 → 해당 사과를 뱀에게 먹이고 apple 리스트에서 삭제
    4. (nx, ny) 위치에 사과가 없으면 → snake.pop()
  2. snake.insert(0, (nx, ny))
  3. 이후 해당 time에 회전해야 한다면 → 회전
  4. 반복

사과를 뱀에게 먹인 후에는 해당 사과를 apple 리스트에서 삭제해주어야 하는데, 이 부분을 놓쳤었습니다. 혹시 디버깅중이시라면 이 부분도 같이 고려해보시면 도움이 될 것 같습니다.

코드

n = int(input())
k = int(input())
apple = [tuple(map(int, input().split())) for _ in range(k)]
l = int(input())
rotation = dict()
for _ in range(l):
    x, c = input().split()
    rotation[int(x)] = -1 if c == 'L' else 1

# -> : 오른쪽 90도, <- : 왼쪽 90도
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

t = 0
d = 0
snake = [(1, 1)]

while True:
    t += 1
    nx = snake[0][0] + dx[d]
    ny = snake[0][1] + dy[d]

    if (nx, ny) in snake or not (1 <= nx <= n and 1 <= ny <= n):
        print(t)
        break

    if (nx, ny) not in apple:
        snake.pop()
    else:
        apple.remove((nx, ny))

    if t in rotation:
        d = (d + rotation[t]) % 4

    snake.insert(0, (nx, ny))

0개의 댓글