Today.dev

[BOJ_3190/Python] 뱀 본문

알고리즘/백준

[BOJ_3190/Python] 뱀

otu165 2021. 7. 5. 03:16

문제

3190번: 뱀

 

3190번: 뱀

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

www.acmicpc.net


풀이

from collections import deque
import sys
input = sys.stdin.readline


def turn(c):
    global dir

    if dir == 'L':
        dir = 'D' if c == 'L' else 'U'
    elif dir == 'R':
        dir = 'U' if c == 'L' else 'D'
    elif dir == 'U':
        dir = 'L' if c == 'L' else 'R'
    elif dir == 'D':
        dir = 'R' if c == 'L' else 'L'


# 입력
N = int(input())  # 보드 크기
K = int(input())  # 사과 개수
apple = [tuple(map(int, input().split())) for _ in range(K)]
L = int(input())  # 뱀의 방향 전환 횟수(X초가 끝난 뒤 L(왼), D(오) 로 90도 회전함)
snake = [list(input().split()) for _ in range(L)]

# 풀이
route = deque()  # TAIL ~ HEAD
route.append((1, 1))  # x, y
dir = 'R'

size = 0
while True:
    x, y = route[-1]

    # 1. 몸 길이 늘리기  # 현재 머리 위치 : (nx, ny)
    size += 1
    if dir == 'L':
        nx, ny = x, y - 1
    elif dir == 'R':
        nx, ny = x, y + 1
    elif dir == 'U':
        nx, ny = x - 1, y
    else:
        nx, ny = x + 1, y

    # 2. 종료 조건
    if (nx, ny) in route or not (1 <= nx <= N and 1 <= ny <= N):
        # 출력
        print(size)
        break

    route.append((nx, ny))

    # 3. 사과 유무
    if (nx, ny) in apple:
        apple.remove((nx, ny))
    else:
        route.popleft()

    # 4. 방향 전환
    if len(snake) != 0 and int(snake[0][0]) == size:
        turn(snake[0][1])
        del snake[0]

뱀의 양쪽을 늘리고 줄이고 해야하기 때문에 덱(deque)을 써야겠다는 생각을 했다.

그런데 문제에서 요구한 조건을 구현하는 것은 잘 했는데 문제에서 뱀이 맨 위 맨 좌측에 위치해 있다는 말을 보고 습관처럼 인덱스는 0 ~ N - 1까지, 뱀 위치는 (0, 0) 좌표 에서 시작하도록 세팅해서 1시간 헤맸다. 어쩐지 내 뱀은 사과 못 먹는데 다른 사람들 뱀은 사과 엄청 먹는거 보고 도대체 뭐가 문제지 싶었다. 정말.. 정말.. 머리 터지는줄 알았다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ_16954/Python] 움직이는 미로 탈출  (0) 2021.07.05
[BOJ_5710/Python] 전기 요금  (0) 2021.07.05
[BOJ_1697/Python] 숨바꼭질  (0) 2021.07.05
[BOJ_14499/Python] 주사위 굴리기  (0) 2021.07.05
[BOJ_1339/Python] 단어 수학  (0) 2021.05.31
Comments