Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(13549) 숨바꼭질 3 본문

백준 (C++)/Solve

(13549) 숨바꼭질 3

dh-winternagi 2026. 4. 19. 17:08

https://www.acmicpc.net/problem/13549

단계별로 풀어보기

29단계(최단 경로) 3번째

 

 

 

숨바꼭질과 비슷하지만, 2x로 이동하는 순간이동의 소요 시간이 1초에서 0초로 바뀌었다.

다익스트라로 풀 수도 있지만, 가중치가 0과 1밖에 없는 특수한 그래프라면 더 효율적인 0-1 BFS를 쓸 수 있다.

다익스트라가 O(E log max(V, E))인 반면 0-1 BFS는 O(V+E)로 선형 시간 복잡도를 갖는다.

0-1 BFS는 큐 대신 덱을 사용한다. 덱의 앞에서 원소를 하나씩 뽑아 가중치가 1인 간선으로 이어진 이웃한 정점의 거리를 갱신하고 덱의 뒤에 다음 정점을 삽입하는 것 까지는 BFS와 같지만,

가중치가 0인 간선으로 이어졌다면 그 이웃한 정점은 현재 정점과 같은 레벨이므로 덱의 맨 앞에 삽입하여 다른 정점보다 빨리 탐색할 수 있도록 한다.

 

 

 

#include <iostream>
#include <deque>
#include <vector>
using namespace std;

int main() {
  int n, k;
  
  cin >> n >> k;
  
  vector<int> dist(100001, -1);
  
  deque<int> dq;
  
  dq.push_back(n);
  dist[n]= 0;
  
  while(!dq.empty()){
    int now= dq.front();
    dq.pop_front();
    
    if(now==k)  break;
    
    if(2*now<=100000 && dist[2*now]==-1){
      dist[2*now]= dist[now];
      dq.push_front(2*now);
    }
    
    if(now-1>=0 && dist[now-1]==-1){
      dist[now-1]= dist[now]+1;
      dq.push_back(now-1);
    }
    
    if(now+1<=100000 && dist[now+1]==-1){
      dist[now+1]= dist[now]+1;
      dq.push_back(now+1);
    }
  }
  
  cout << dist[k];
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(11657) 타임머신  (0) 2026.04.19
(9370) 미확인 도착지  (0) 2026.04.19
(1504) 특정한 최단 경로  (0) 2026.04.19
(1753) 최단경로  (0) 2026.04.19
(1766) 문제집  (0) 2026.04.19