728x90
문제 설명
이 게임은 뱀이 사과를 먹으면서 길어지고, 벽이나 자기 몸에 부딪히면 게임이 끝나는 간단한 규칙을 가지고 있다.
게임은 N x N 크기의 정사각형 보드에서 진행된다. 뱀은 처음에 보드의 맨 위 맨 좌측에 위치하며, 오른쪽을 향하고 있다. 몇몇 칸에는 사과가 놓여있다.
뱀은 매 초마다 이동하며, 이동 규칙은 다음과 같다:
- 뱀은 머리를 다음 칸으로 이동시킨다.
- 이동한 칸에 사과가 있으면 사과를 먹고 꼬리는 그대로 있다 (몸길이가 늘어난다).
- 이동한 칸에 사과가 없으면 꼬리를 줄여서 몸길이는 그대로이다.
- 만약 벽이나 자기 자신과 부딪히면 게임이 끝난다.
게임이 몇 초 만에 끝나는지 계산하는 것이 이 문제의 목표이다.
해결 방법: 시뮬레이션을 사용한 구현
이 문제는 시뮬레이션을 통해 해결할 수 있다. 매 초마다 뱀의 움직임을 따라가면서 게임 종료 조건을 체크하면 된다.
구현 단계
- 입력 처리
- 보드의 크기 N과 사과의 개수 K를 입력받는다.
- 사과의 위치를 보드에 표시한다.
- 방향 변환 횟수 L과 방향 변환 정보를 입력받아 리스트로 저장한다.
- 필요한 자료 구조 초기화
- 보드를 나타낼 2차원 리스트 board를 만든다.
- 뱀의 현재 위치와 방향을 저장한다.
- 뱀의 몸은 deque로 관리하여 머리와 꼬리를 쉽게 추가/삭제한다.
- 방향 변환 정보를 큐로 관리한다.
- 뱀의 이동을 시뮬레이션
- 시간 time을 1씩 증가시키면서 매 초마다 다음을 수행한다:
- 현재 방향으로 머리를 이동한다.
- 이동한 위치가 벽이나 자기 몸인지 확인한다.
- 그렇다면 게임을 종료한다.
- 이동한 위치에 사과가 있는지 확인한다.
- 사과가 있으면 사과를 제거하고 몸길이를 늘린다 (꼬리는 그대로).
- 사과가 없으면 꼬리를 줄여서 몸길이를 유지한다.
- 방향 변환 시간이 되면 방향을 변경한다.
- 시간 time을 1씩 증가시키면서 매 초마다 다음을 수행한다:
- 게임 종료 및 결과 출력
- 게임이 종료되면 현재 시간 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
'Python > 백준' 카테고리의 다른 글
백준 테트로미노 [14500] Python 코드 + 해설 (0) | 2024.10.22 |
---|---|
백준 주사위 굴리기 [14499] Python 코드 + 해설 (0) | 2024.10.22 |
백준 시험 감독 [13458] Python 코드 + 해설 (1) | 2024.10.22 |
백준 2048 (Easy) [12100] Python 코드 + 해설 (0) | 2024.10.22 |
백준 구슬 탈출 2 [13460] Python 코드 + 해설 (1) | 2024.10.21 |