# Coding/# 백준

[백준 / 3190] 뱀 - Python

강현들 2021. 12. 23. 17:23
728x90
반응형

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

 

3190번: 뱀

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

www.acmicpc.net

<풀이>

뱀의 위치를 리트스에 저장한다. 다음 칸에 가게 된다면 맨 뒤 위치를 지우고, 다음 위치를 저장해서 길이를 유지한다.

만약 사과를 먹게 된다면 맨 뒤 위치를 지우지 않고, 다음 위치를 저장해서 길이를 늘린다.

 

만약 다음 위치가 벽이나(N을 넘어가거나 0보다 작아지는 경우), 뱀의 몸이라면(다음 위치가 body리스트 안에 있다면) 해당 이동을 멈추고 현재 시간을 출력한다.

 

<전체 코드>

import sys

N = int(sys.stdin.readline())
K = int(sys.stdin.readline())
apples = []
for i in range(K):
    row, col = map(int, sys.stdin.readline().split())
    apples.append([row-1, col-1])

L = int(sys.stdin.readline())
movement = []
for i in range(L):
    X, C = sys.stdin.readline().split()
    movement.append([int(X), C])
movement.append([0, 0])

# 1북, 2동, 3남, 4서
direction = 2
now_time = 0

move_index = 0
head_row = 0
head_col = 0
body = [[0, 0]]
while True:
    now_time += 1
    # 한 칸 이동
    if direction == 1:
        head_row -= 1
    elif direction == 2:
        head_col += 1
    elif direction == 3:
        head_row += 1
    else:
        head_col -= 1
    # 이동칸이 벽인경우
    if head_row < 0 or head_row >= N or head_col < 0 or head_col >= N:
        break
    # 이동칸이 몸인 경우
    if [head_row, head_col] in body:
        break
    # 이동칸이 사과인 경우
    if [head_row, head_col] in apples:
        apples.remove([head_row, head_col])
        body.insert(0, [head_row, head_col])
    # 이동칸이 아무 것도 아닌 경우
    else:
        body.insert(0, [head_row, head_col])
        body.pop()

    if movement[move_index][0] == now_time:
        if movement[move_index][1] == 'L':
            direction -= 1
            if direction < 1:
                direction = 4
        else:
            direction += 1
            if direction > 4:
                direction = 1
        move_index += 1

print(now_time)
728x90
반응형