[백준] 3190 - 뱀 (python)

2022. 1. 1. 21:56개발/알고리즘

문제 자체는 단순 구현문제이고, 기존에 C++로도 풀었기에 생각보다 어렵지 않았다.

 

다음 부분을 그대로 구현하는게 핵심적인 문제라고 생각하면 된다.

 

뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.

  • 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
  • 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
  • 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

결국 머리 위치만 잘 이동해주면 되고 (list.insert로 제일 앞에 삽입해줌)

중간 몸은 그대로 두고, 꼬리만 사과를 먹지 못하면 삭제를 하면 되었다.

 

또 놓치기 쉬운 부분이 하나 있는데..

게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다.

해당 부분을 놓쳤었고, 이동전에 회전하도록 로직을 작성했었어서 문제를 못풀었었다.

 

N = int(input())
K = int(input())

dy = [0,1,0,-1]
dx = [1,0,-1,0]

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

L = int(input())

rotate = []
for i in range(L):
    t, d = input().split()
    t = int(t)
    rotate.append([t,d])

snake = [[1,1]]

direction = 0

t = 0
while True:
    t += 1

    y, x = snake[0][0], snake[0][1]
    moved_y, moved_x = y + dy[direction], x + dx[direction]

    if moved_y > N or moved_y < 1 or moved_x > N or moved_x < 1:
        print(t)
        break

    if [moved_y, moved_x] in snake:
        print(t)
        break

    if [moved_y, moved_x] in apples:
        apples.remove([moved_y,moved_x])
    else:
        del snake[-1]

    snake.insert(0,[moved_y,moved_x])

    if len(rotate) > 0:
        if rotate[0][0] == t:
            if rotate[0][1] == 'D':
                direction = (direction + 1) % 4
            else:
                direction = (direction - 1) % 4
            del rotate[0]

 

 

'개발 > 알고리즘' 카테고리의 다른 글

[프로그래머스] 기둥과 보설치 (Python)  (0) 2021.12.30
[BOJ 1414] 사탕  (0) 2019.03.28