백준 3190번: 뱀

이형준·2023년 4월 16일
0

백준

목록 보기
1/3

딱히 기발한 풀이가 생각나지 않았기에 최대한 주어진 걸 깔끔하게 구현하려 노력했던 문제였다. 완벽하게 기능하기까지 코드 작성부터 디버깅까지 많은 시간을 잡아먹은 코드라 뭐랄까 내 코드에 애착이 간다. 뭔가 변태같지만 진짜 내 코드가 이뻐보이는 걸 어떡해 😄

import sys
import itertools
from collections import deque
N = int(sys.stdin.readline())
K = int(sys.stdin.readline())
apples = [list(map(int, sys.stdin.readline().split())) for _ in range(K)]
L = int(sys.stdin.readline())
moves = [list(sys.stdin.readline().split()) for _ in range(L)]
direction = deque([1, 0, 0, 0])

def checkDirection():
    global sec, direction
    if moves:
        if sec == int(moves[0][0]):
            if moves[0][1] == 'L':
                temp = direction.popleft()
                direction.append(temp)
            elif moves[0][1] == 'D':
                temp = direction.pop()
                direction.appendleft(temp)
            del moves[0]

def moveSnake():
    global snake, direction
    if direction == deque([1, 0, 0, 0]):
        snake.appendleft([snake[0][0], snake[0][1]+1])
    elif direction == deque([0, 0, 0, 1]):
        snake.appendleft([snake[0][0]-1, snake[0][1]])
    elif direction == deque([0, 0, 1, 0]):
        snake.appendleft([snake[0][0], snake[0][1]-1])
    elif direction == deque([0, 1, 0, 0]):
        snake.appendleft([snake[0][0]+1, snake[0][1]])
        


def checkApple():
    global snake, apples
    if snake[0] in apples:
        apples.remove(snake[0])
    else:
        snake.pop()

sec = 0
snake = deque([[1,1]])
while True:
    sec += 1
    moveSnake()
    if len(snake) > 1:
        if snake[0] in list(itertools.islice(snake, 1, len(snake))):
            print(sec)
            break
    if snake[0][0] > N or snake[0][1] > N or snake[0][0] <= 0 or snake[0][1] <= 0:
        print(sec)
        break
    checkApple()
    checkDirection()
profile
저의 미약한 재능이 세상을 바꿀 수 있을 거라 믿습니다.

0개의 댓글