https://www.acmicpc.net/problem/16173
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 3)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
‘쩰리’가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력합니다.
너비 우선 탐색 BFS 알고리즘을 이용하여 문제를 풀 수 있다.
from collections import deque
import sys
input = sys.stdin.readline
n = int(input()) # 게임 구역의 크기 n 입력
board = []
for _ in range(n):
board.append(list(map(int, input().split())))
visit = []
# 방문 여부 체크 (초깃값 False로 설정)
for _ in range(n):
visit.append([False]*n)
# 오른쪽과 아래에 대한 방향 설정
dx = [1, 0]
dy = [0, 1]
# 너비 우선 탐색(BFS) 알고리즘 함수 정의
def bfs(x, y, visit):
queue = deque()
queue.append((x, y))
visit[x][y] = True
while queue:
x, y = queue.popleft()
# 맨 오른쪽 아래에 도달하면 HaruHaru 출력
if board[x][y] == -1:
return 'HaruHaru'
jump = board[x][y]
# 오른쪽과 아래 탐색
for i in range(2):
# 좌표에 대한 이동은 기존 x, y 값에 점프값과 방향값을 곱하여 이동
nx = x+dx[i]*jump
ny = y+dy[i]*jump
# 범위 안에 있고, 방문하지 않았으면 방문 체크 후 queue에 넣기
if 0 <= nx < n and 0 <= ny < n and visit[nx][ny] == 0:
visit[nx][ny] = True
queue.append((nx, ny))
return 'Hing'
print(bfs(0, 0, visit))
게임 구역의 크기 n을 입력받고, n만큼 게임판의 맵을 입력받는다.
방문 여부를 체크하기 위해 n개의 리스트 요소의 초깃값을 false로 설정해준다.
이동 방향을 설정해주기 위해 dx와 dy의 좌표값을 선언해준다.
큐를 사용하여 해당 x, y 좌표를 넣고, 그 좌표를 true로 방문 처리를 해준다.
x, y 값을 덱을 이용하여 삭제해주고, if문으로 게임판의 지점이 -1이라면 'HaruHaru'를 반환해준다.
도착 칸의 수만큼 점프를 하기 위해 jump 변수에 현재 지점의 값을 넣어준다.
이동한 좌표 (nx, ny) 를 구하기 위해 현재 위치 (x, y)와 방향 값인 (dx, dy)에 점프할 값인 jump를 곱한 것을 더해준다.
만약, 이동한 좌표 nx, ny가 범위 안에 있고, 방문하지 않은 지점이라면 True로 방문 처리를 해주고 큐에 좌표를 넣어준다.
큐가 참일때까지 반복해주어 if문에 걸리지 않는다면 'Hing'을 반환해준다.
(x, y)를 출발점인 (0, 0)으로 하고, n만큼의 크기인 visit을 매개변수로 하는 bfs 함수를 호출하여 그 반환값을 출력한다.
문제가 길고 어려워서 포스팅을 계속 미뤘던 문제...ㅠㅠ
결국 하긴 했는데 힘들지만 뿌듯하다!!
코드 분석 왜케 길어ㅋㅋㅋ🤣