백준 3190 뱀 / python

이유참치·2025년 8월 13일

백준

목록 보기
44/248

문제 : 3190

풀이 point

사과를 먹으면 꼬리(마지막)와 머리(처음)를 grid에서 뱀의 몸통이 있다고 표시해준다.
만약 사과가 없다면 머리만 표시해준다. (몸이 커지지 않아 꼬리 부분은 이동 때문에 더이상 뱀이 차지하고 있지 않음)

이 과정을 반복하며 입력 받은 시간마다 방향전환 리스트를 참고해 그 시간에 도달하면 방향을 전환해준다.

큐를 통해 위와 같은 과정을 반복할 수 있다.
만약 사과가 없다면 꼬리 부분은 없애준다.(큐에서 맨 왼쪽 값)
그리고 현재 머리가 위치한 부분은 1로 표시해 주며 큐에도 값을 넣어준다.

방향전환이 필요하다면 방향전환을 해준다.

풀이 방법

방향은 처음엔 0으로 설정해주고, 값이 들어올때마다 다음과 같은 식으로 변경해주면 된다.

def turnDirection(direc, C):
    if C == 'L':
        return (direc - 1) % 4
    else:
        return (direc + 1) % 4
        
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

dx, dy를 다음과 같은 형식으로 설정해주었기 때문에 왼,,, 아래 

dx, dy의 경우는 다음과 같이 설정해준다.(방향에 맞춘 값들)

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

풀이 코드

#백준, 3190 뱀

from collections import deque

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

N = int(input())
K = int(input())
grid = [[0]*(N+1) for i in range(N+1)]
directions = {}

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

L = int(input())

for i in range(L):
    X, C = input().split()
    directions[int(X)] = C

x, y = 1, 1
cnt = 0
direc = 0
grid[1][1] = 1
Q = deque()
Q.append((1, 1))

def turnDirection(direc, C):
    if C == 'L':
        return (direc - 1) % 4
    else:
        return (direc + 1) % 4

while True:
    cnt += 1
    x += dx[direc]
    y += dy[direc]

    if x > N or y > N or x <= 0 or y <= 0:
        break
    if grid[x][y] == 1:
        break
    elif grid[x][y] == 0:
        bx, by = Q.popleft()
        grid[bx][by] = 0
    
    grid[x][y] = 1
    Q.append((x, y))
    if cnt in directions:
        direc = turnDirection(direc, directions[cnt])

print(cnt)

사족

처음에 헷갈렸던게 그저 뱀을 그리드에 채우는 형식으로 생각하면 되는 것을 뱀이 움직이다고 생각하여 매번 그리드를 갱신해줘야겠구나 착각하였다. 근데 그저 꼬리와 머리만 1 또는 0으로 설정해주고 방향마다 바꿔주면 되는 문제였다... 큐를 사용해서 어떻게 활용하지를 좀 더 생각했다면 쉽게 풀었을 것 같다. 아쉽다.

profile
임아리 - 대학생

0개의 댓글