수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
queue
를 이용해서 최단 거리를 구할 수 있다.1
일 때 사용할 수 있다.x
점에 있을 때, 1초를 소요해서 앞으로 한 칸, 뒤로 한 칸 갈 수 있고 또는 바로 2x
점으로 순간이동 할 수 있다. 따라서 간선의 가중치가 1
로 동일하다고 할 수 없다.1
로 만들 수 있다.다중 queue
를 사용할 수 있다. 예를 들어, 0
인 간선을 저장하는 큐, 1인 간선을 저장하는 큐, 2인 간선을 저장하는 큐 등으로 여러 큐를 만든 다음 원하는 곳에 push-pop 하도록 구현해서 가중치를 1
로 만들 수 있다.deque
을 이용해서 구현한다.push_back()
으로 정점을 뒤로 넣어준다.push_front()
로 정점을 앞으로 넣어준다.#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
int n, k, ans = INT32_MAX;
bool visited[100001];
int main(){
cin >> n >> k;
deque<pair<int,int>> q;
q.push_back(make_pair(n,0));
while(!q.empty()){
int pos = q.front().first, t = q.front().second;
int goPos = pos + 1, backPos = pos - 1, telePos = 2 * pos;
q.pop_front();
if(pos == k) ans = min(ans, t);
if(telePos <= 100001 && !visited[telePos]){
visited[telePos] = true;
q.push_front({telePos, t});
}
if(backPos >= 0 && !visited[backPos]){
visited[backPos] = true;
q.push_back(make_pair(backPos, t + 1));
}
if(goPos <= 100001 && !visited[goPos]){
visited[goPos] = true;
q.push_back(make_pair(goPos, t + 1));
}
}
cout << ans << '\n';
}