문제 : 백준 13549 숨바꼭질3 💁♀️
난이도 : 골드 5
1️⃣ 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다.
2️⃣ 수빈이는 걷거나 순간이동을 할 수 있다.
즉, 최단 거리 문제 중에서 그래프 간선에 가중치가 0또는 1이 있는 문제라고 할 수 있다!!
그러나, BFS는 최단 거리 문제 중 그래프 간선에 가중치가 없는 문제는 해결할 수 있다.
따라서 다익스트라 알고리즘를 사용하여 문제를 해결해야 한다!!
참고한 풀이 : https://jdselectron.tistory.com/58
int N = 0, K = 0; //수빈이의 위치, 동생의 위치
cin >> N >> K;
... 생략 ...
que.push({0,N}); //걸린 시간, 위치
... 생략 ...
if(here == K) break;
사진 출처 : https://velog.io/@717lumos/알고리즘-다익스트라Dijkstra-알고리즘#3-구현2-우선순위-큐
💁♀️ 더 자세한 내용은 위의 출처 블로그를 참고해주세요~!!
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> que;
que.push({0,N}); //걸린 시간, 위치
check[N] = 1;
while(!que.empty()){
int here = que.top().second; //현재 위치
int time = que.top().first; //걸린 시간
if(here == K) break;
que.pop();
if(here*2 < MAXSIZE and check[here*2] == 0){
check[here*2] = 1;
que.push({time, here*2}); //순간이동
}
if(here+1 < MAXSIZE and check[here+1] == 0){
check[here+1] = 1;
que.push({time+1, here+1});
}
if(here-1 >= 0 and check[here-1] == 0){
check[here-1] = 1;
que.push({time+1, here-1});
}
}
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int MAXSIZE = 100001;
int check[100001] = {0,};
int main() {
std::ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N = 0, K = 0; //수빈이의 위치, 동생의 위치
cin >> N >> K;
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> que;
que.push({0,N}); //걸린 시간, 위치
check[N] = 1;
while(!que.empty()){
int here = que.top().second; //현재 위치
int time = que.top().first; //걸린 시간
if(here == K) break;
que.pop();
if(here*2 < MAXSIZE and check[here*2] == 0){
check[here*2] = 1;
que.push({time, here*2}); //순간이동
}
if(here+1 < MAXSIZE and check[here+1] == 0){
check[here+1] = 1;
que.push({time+1, here+1});
}
if(here-1 >= 0 and check[here-1] == 0){
check[here-1] = 1;
que.push({time+1, here-1});
}
}
cout<<que.top().first<<"\n";
}