https://www.acmicpc.net/problem/16173
💡문제 분석 요약
‘쩰리’는 점프하는 것을 좋아하는 젤리다. 단순히 점프하는 것에 지루함을 느낀 ‘쩰리’는 새로운 점프 게임을 해보고 싶어 한다. 새로운 점프 게임의 조건은 다음과 같다.
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
💡알고리즘 설계
bfs로 풀기
- ground를 입력받는다
- 첫번째 위치에서 이동 가능하고 방문하지 않은 위치를 queue에 추가한다.
- 해당 queue에 있는 위치에서 하나를 뽑아 이동 가능한 위치를 queue에 추가한다.
- ground[n-1][n-1]에 도착 시 HaruHaru를 출력한다.
- queue가 모두 빌 때 까지 (n-1,n-1)에 도착하지 못하면 Hing을 출력한다.
💡코드
from collections import deque
N = int(input())
ground = [list(map(int, input().split())) for _ in range(N)]
visited = [[False for _ in range(N)] for _ in range(N)]
queue=deque()
queue.append((0,0))
while queue:
x, y=queue.popleft()
visited[y][x]=True
if y==N-1 and x==N-1:
print('HaruHaru')
break
if x+ground[y][x]<N and not visited[y][x+ground[y][x]]:
queue.append((x+ground[y][x], y))
if y+ground[y][x]<N and not visited[y+ground[y][x]][x]:
queue.append((x, y+ground[y][x]))
else:
print('Hing')
💡 느낀점 or 기억할 정보
간단한 BFS 문제였다.
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준 10546] 배부른 마라토너 - python (0) | 2025.01.08 |
---|---|
[백준 15624] 피보나치 수 7 - python, js (0) | 2025.01.07 |
[백준 20186] 수 고르기 - python, js (0) | 2025.01.04 |
[백준 13706번] 제곱근 - python, js (1) | 2025.01.03 |
[백준 26517] 연속인가? ? - python, js (0) | 2025.01.02 |