난이도 : Silver2
Link : https://www.acmicpc.net/problem/1326
Tag : 그래프 이론, 그래프 탐색, 너비 우선 탐색
풀이일자 : 2024년 9월 9일
개구리는 a번째 징검다리에서 b번째 징검다리까지 최소 몇번 점프를 해야하는지 구하는 문제이다.
조건)
개구리는 징검다리에 쓰여있는 수의 배수만큼 떨어져 있는 곳으로만 갈 수 있다.
징검다리의 개수는 N(1<= N <= 10,000)이므로 최악인 시간복잡도인 항상 한칸만 점프할 때를 가정해도 10,000번만 반복하면 되기 때문에 문제 없어 보인다.
개구리의 위치의 숫자를 파악하고 숫자의 배수중 징검다리로 부터 가장 멀리 떨어진 곳으로 도달하는 것이 가장 중요하다.
BFS를 이용하여 방문횟수를 파악하여 B번째 징검다리에 도달했을 때 점프 횟수를 반환하면 될것이라고 판단한다.
문제에서 오른쪽으로만 점프하는지, 왼쪽으로 점프하는지 명시되어 있지 않기 때문에 둘다의 경우를 확인해야 한다.
- bridge[now]만큼 간격을 주어 점프 할 수 있는 곳을 확인한다.
- if visited[i] == -1 이라면 방문한적이 없는 징검다리이므로 , 해당 징검다리를 몇번 점프해야 방문 할 수 있는지 visited[i] 에 추가한다.
- 만일 i 가 끝에 가고 싶은 징검다리라면 해당 점프 횟수를 반환한다.
- 전체를 탐색해도 가고싶은 징검다리가 나오지 않는다면 -1을 반환한다.
from collections import deque
N = int(input())
bridge = list(map(int, input().split()))
bridge.insert(0,0)
a,b = map(int, input().split())
def BFS(start, end):
queue = deque([start]) #시작 위치 설정
visited = [-1] * (N+1) # 방문 노드 표시 (방문하지 않은곳 -1)
visited[start] = 0 #방문시 0
while queue:
now = queue.popleft() #현재 노드 탐색
# 오른쪽 방향 탐색
for i in range(now, N + 1 , bridge[now]):
if visited[i] == -1 :
queue.append(i)
visited[i] = visited[now] + 1 #i까지 도달하는데 필요한 점프 횟수 추가
if i == end:
return visited[i]
# 왼쪽 방향 탐색
for i in range(now, 0, -bridge[now]):
if visited[i] == -1:
queue.append(i)
visited[i] = visited[now]
if i == end:
return visited[i]
return -1
print(BFS(a, b))
from collections import deque
N = int(input())
bridge = list(map(int, input().split()))
bridge.insert(0,0)
a,b = map(int, input().split())
def BFS(start, end):
queue = deque([start]) #시작 위치 설정
visited = [-1] * (N+1) # 방문 노드 표시 (방문하지 않은곳 -1)
visited[start] = 0
while queue:
now = queue.popleft() #현재 노드 탐색
# 오른쪽 방향 탐색
for i in range(now, N + 1 , bridge[now]):
if visited[i] == -1 :
queue.append(i)
visited[i] = visited[now] + 1 #i까지 도달하는데 필요한 점프 횟수 추가
if i == end:
return visited[i]
# 왼쪽 방향 탐색
for i in range(now, 0, -bridge[now]):
if visited[i] == -1:
queue.append(i)
visited[i] = visited[now] + 1
if i == end:
return visited[i]
return -1
print(BFS(a, b))