728x90
백준, 뱀
❓문제
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
❓분류 : pass!!!
예전에 정답코드를 보고도 이해하지 못했던 문제였는데 스스로 풀어서 기쁘다!
❓ 풀이
이 문제의 핵심은 뱀의 길이를 늘렸다 줄였다 할 수 있다는 점이다.
가장 처음 발자취를 남긴 뱀의 위치(꼬리)를 없애줘야 하기 때문에 순서가 중요!
그리고 FIFO해줘야 하므로 QUEUE를 사용해야한다.
나는 추후 이동 방향을 결정하는 정보(3 L, 8 D)도 큐를 활용했다.
📜나의 코드
from collections import deque
# 게임이 끝나는 시간을 리턴
# N = 10
N = int(input())
# K = 4
K = int(input())
regions = [[0 for _ in range(N)] for _ in range(N)]
for _ in range(K):
r, c = map(int, input().split())
# 사과 2
regions[r-1][c-1] = 2
# print(regions)
# regions = [[0, 2, 2, 2, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
row, column = 0, 0 # 초기 위치 : 맨 위 맨 좌측 (1행 1열), 뱀의 길이 : 1
regions[row][column] = 1 # 뱀 표시
snake = deque([(0, 0)]) # 뱀의 길이 : 1
# L = 4
L = int(input())
move = deque([])
for _ in range(L):
X, C = input().split()
move.append((int(X), C))
# print(move)
# move = deque([(8, 'D'), (10, 'D'), (11, 'D'), (13, 'L')])
# 북 동 남 서
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
d = 1 # 초기 뱀의 방향 오른쪽
time = 0
while True:
time += 1
if move:
# 게임 시작 시간으로부터 X초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다는 뜻이다.
X, C = move[0]
if time > X:
d = (d+1)% 4 if C == 'D' else (d-1)%4
move.popleft()
next_r, next_c = row + dr[d], column + dc[d]
# 2. 벽이나 자신의 몸에 부딪히면 게임 끝
if not(0<=next_r<N and 0<=next_c<N) or (next_r, next_c) in snake:
# if not(0<=next_r<N and 0<=next_c<N) or regions[next_r][next_c] == 1:
break
else:
# 1. 몸의 길이를 늘려 머리를 다음칸에 위치시킨다.
row, column = next_r, next_c
snake.append((row, column))
if regions[row][column] == 2:
# 3. 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
regions[row][column] = 1
else:
# 4. 이동한 칸에 사과가 없다면, 몸의 길이를 줄여 꼬리가 위치한 칸을 비워준다. 즉, 몸 길이는 변하지 않는다.
regions[row][column] = 1
r, c = snake.popleft()
regions[r][c] = 0
print(time)
'알고리즘' 카테고리의 다른 글
백준, 사다리 조작 (1) | 2023.10.13 |
---|---|
프로그래머스, 여행경로 (0) | 2023.10.12 |
프로그래머스, 게임 맵 최단거리 (0) | 2023.09.25 |
프로그래머스, 광물캐기 (0) | 2023.09.10 |
백준, 최소 비용 구하기 (0) | 2023.09.01 |