본문 바로가기
Python/백준

백준 뱀 [3190] Python 코드 + 해설

by Guardy 2024. 10. 22.
728x90

문제 설명

이 게임은 뱀이 사과를 먹으면서 길어지고, 벽이나 자기 몸에 부딪히면 게임이 끝나는 간단한 규칙을 가지고 있다.

게임은 N x N 크기의 정사각형 보드에서 진행된다. 뱀은 처음에 보드의 맨 위 맨 좌측에 위치하며, 오른쪽을 향하고 있다. 몇몇 칸에는 사과가 놓여있다.

뱀은 매 초마다 이동하며, 이동 규칙은 다음과 같다:

  1. 뱀은 머리를 다음 칸으로 이동시킨다.
  2. 이동한 칸에 사과가 있으면 사과를 먹고 꼬리는 그대로 있다 (몸길이가 늘어난다).
  3. 이동한 칸에 사과가 없으면 꼬리를 줄여서 몸길이는 그대로이다.
  4. 만약 벽이나 자기 자신과 부딪히면 게임이 끝난다.

게임이 몇 초 만에 끝나는지 계산하는 것이 이 문제의 목표이다.

해결 방법: 시뮬레이션을 사용한 구현

이 문제는 시뮬레이션을 통해 해결할 수 있다. 매 초마다 뱀의 움직임을 따라가면서 게임 종료 조건을 체크하면 된다.

구현 단계

  1. 입력 처리
    • 보드의 크기 N과 사과의 개수 K를 입력받는다.
    • 사과의 위치를 보드에 표시한다.
    • 방향 변환 횟수 L과 방향 변환 정보를 입력받아 리스트로 저장한다.
  2. 필요한 자료 구조 초기화
    • 보드를 나타낼 2차원 리스트 board를 만든다.
    • 뱀의 현재 위치와 방향을 저장한다.
      • 뱀의 몸은 deque로 관리하여 머리와 꼬리를 쉽게 추가/삭제한다.
    • 방향 변환 정보를 큐로 관리한다.
  3. 뱀의 이동을 시뮬레이션
    • 시간 time을 1씩 증가시키면서 매 초마다 다음을 수행한다:
      • 현재 방향으로 머리를 이동한다.
      • 이동한 위치가 벽이나 자기 몸인지 확인한다.
        • 그렇다면 게임을 종료한다.
      • 이동한 위치에 사과가 있는지 확인한다.
        • 사과가 있으면 사과를 제거하고 몸길이를 늘린다 (꼬리는 그대로).
        • 사과가 없으면 꼬리를 줄여서 몸길이를 유지한다.
      • 방향 변환 시간이 되면 방향을 변경한다.
  4. 게임 종료 및 결과 출력
    • 게임이 종료되면 현재 시간 time을 출력한다.

최종 파이썬 코드는 아래와 같다.

from collections import deque

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

# 사과 위치 입력
for _ in range(K):
    a, b = map(int, input().split())
    board[a-1][b-1] = 1  # 사과는 1로 표시

L = int(input())
directions = deque()
for _ in range(L):
    X, C = input().split()
    directions.append((int(X), C))

# 초기 설정
snake = deque()
snake.append((0, 0))
board[0][0] = 2  # 뱀의 몸은 2로 표시

# 방향: 동, 남, 서, 북 (시계 방향)
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
direction = 0  # 초기 방향은 동쪽
time = 0

while True:
    time += 1
    head_x, head_y = snake[-1]
    nx = head_x + dx[direction]
    ny = head_y + dy[direction]

    # 벽에 부딪히거나 자기 자신과 부딪히면 게임 종료
    if nx < 0 or nx >= N or ny < 0 or ny >= N or board[nx][ny] == 2:
        break

    # 사과가 있으면 머리 추가하고 사과 제거
    if board[nx][ny] == 1:
        board[nx][ny] = 2
        snake.append((nx, ny))
    else:
        # 사과가 없으면 머리 추가하고 꼬리 제거
        board[nx][ny] = 2
        snake.append((nx, ny))
        tail_x, tail_y = snake.popleft()
        board[tail_x][tail_y] = 0

    # 방향 변환 시간 체크
    if directions and time == directions[0][0]:
        _, c = directions.popleft()
        if c == 'L':
            direction = (direction - 1) % 4
        else:
            direction = (direction + 1) % 4

print(time)

정답 파이썬 코드

도움이 되셨다면 공감 및 댓글 부탁드립니다.

728x90