상세 컨텐츠

본문 제목

[백준 3190번] 뱀(파이썬)

알고리즘 공부

by Tabris4547 2022. 4. 3. 21:41

본문

728x90

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

 

3190번: 뱀

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

www.acmicpc.net

뱀이 움직이는 걸 표현하는 문제입니다.

 

여기서 구현할 포인트는

뱀의 몸통과

이동시의 뱀의 몸통입니다.

 

저는 이걸 구현하기 위해

deque의 appendleft와 pop을 사용했습니다.

deque에서 맨 앞이 머리쪽이고

맨 뒤가 꼬리라고 놓고 생각했습니다.

 

문제를 읽어보면

사과가 있으면

머리만 움직이고

사과가 없으면

꼬리가 위치한 칸을 비워준다고 되있습니다.

사과가 있던 없던

움직이면 deque앞에

appendleft로 이동칸을 추가하되

사과가 없다면

pop()으로 꼬리를 제거했습니다.

그리고 이동전에는

현재 이동하는 위치가

뱀의 몸통과 이어있는지 판단했습니다.

 

코드를 보겠습니다.

 

# 백준 3190 뱀
from collections import deque

N = int(input())
room = [[0] * N for _ in range(N)]

K = int(input())
for _ in range(K):
    x, y = map(int, input().split())
    room[x - 1][y - 1] = 1

move = []

L = int(input())

for _ in range(L):
    x, y = input().split()
    move.append([int(x), y])
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]

direct = 0

head = [0, 0]
body = deque()
body.append([head])

turn = 0
while turn <= 10000:
    # 턴을 만족할 때 뱀이 턴
    if move:
        if move[0][0] == turn:
            if move[0][1] == 'D':
                direct = (direct - 1) % 4
            elif move[0][1] == 'L':
                direct = (direct + 1) % 4
            move.pop(0)
    nx, ny = head
    nx += dx[direct]
    ny += dy[direct]
    # 벽을 부딪히면 이동종료
    if nx < 0 or nx >= N or ny < 0 or ny >= N:
        # print("wall")
        turn += 1
        break
    # 움직인 곳에 사과가 있다면 몸이 늘어난다
    if room[nx][ny] == 1:
        body.appendleft([nx, ny])
        room[nx][ny] = 0
        # 사과가 없다면 몸통이 이동한다
    else:
        # 몸통이랑 부딪히면 종료
        if [nx, ny] in body:
            # print("body")
            turn += 1
            break
        body.appendleft([nx, ny])
        body.pop()

    head = [nx, ny]
    turn += 1

    # print(head)
    # print(room)
    # print(body)
print(turn)

 

문제에서 다소 헷갈리는 포인트는

break하면서 turn+1해주는 것입니다.

벽이랑 부딪히든

몸통이랑 부딪히든

어찌되었든 움직인 거니

1초 반영이 된 것이죠.

appendleft에 대해서 배울 수 있었던

좋은 문제였습니다.

 

728x90

관련글 더보기

댓글 영역