728x90
반응형
https://www.acmicpc.net/problem/1326
문제
개구리가 일렬로 놓여 있는 징검다리 사이를 폴짝폴짝 뛰어다니고 있다. 징검다리에는 숫자가 각각 쓰여 있는데, 이 개구리는 매우 특이한 개구리여서 어떤 징검다리에서 점프를 할 때는 그 징검다리에 쓰여 있는 수의 배수만큼 떨어져 있는 곳으로만 갈 수 있다.
이 개구리는 a번째 징검다리에서 b번째 징검다리까지 가려고 한다. 이 개구리가 a번째 징검다리에서 시작하여 최소 몇 번 점프를 하여 b번째 징검다리까지 갈 수 있는지를 알아보는 프로그램을 작성하시오.
입력
첫째 줄에 징검다리의 개수 N(1≤N≤10,000)이 주어지고, 이어서 각 징검다리에 쓰여 있는 N개의 정수가 주어진다. 그 다음 줄에는 N보다 작거나 같은 자연수 a, b가 주어지는 데, 이는 개구리가 a번 징검다리에서 시작하여 b번 징검다리에 가고 싶다는 뜻이다. 징검다리에 쓰여있는 정수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 개구리가 a번 징검다리에서 b번 징검다리로 최소 몇 번 점프하여 갈 수 있는 지를 출력하시오. a에서 b로 갈 수 없는 경우에는 -1을 출력한다.
풀이
Code
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
array = [0] + list(map(int, input().split()))
a, b = map(int, input().split())
# 1. 발문 여부 리스트 생성
visited = [False] * (n+1)
# 2. 큐에 현재 위치 삽입
queue = deque()
queue.append((a, 0))
visited[a] = True
# 3.
while queue :
# 3-1. (위치, 점프 수) 반환
now, jump = queue.popleft()
# 3-2. 징검다리 수 추출
d = array[now]
# 3-3. 종료 조건 탐색
if (b - now) % d == 0 : print(jump + 1); exit() # 점프 수 출력 후 종료
# 3-4. 왼쪽으로 점프
for next in range(now, 0 , - d) :
# 방문하지 않은 경우
if not visited[next] :
# 방문 처리
visited[next] = True
# 큐에 (다음 위치, 점프 수) 삽입
queue.append((next, jump + 1))
# 3-5. 오른쪽으로 점프
for next in range(now + d, n, d) :
# 방문하지 않은 경우
if not visited[next] :
# 방문 처리
visited[next] = True
# 큐에 (다음 위치, 점프 수) 삽입
queue.append((next, jump + 1))
# 4. 도달하지 못 하는 경우 결과 출력
print(-1)
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 17087. 숨바꼭질 6 (0) | 2023.08.03 |
---|---|
[Python/BOJ] 5397. 키로거 (0) | 2023.08.03 |
[Python/BOJ] 21314. 민겸 수 (0) | 2023.08.02 |
[Python/BOJ] 17086. 아기 상어 2 (0) | 2023.08.01 |
[Python/BOJ] 12891. DNA 비밀번호 (0) | 2023.08.01 |