개발자 김수진

[백준] 13913번. 숨바꼭질4 본문

알고리즘/백준

[백준] 13913번. 숨바꼭질4

김수진장 2021. 1. 3. 20:54

[문제]

 

www.acmicpc.net/problem/13913

 

13913번: 숨바꼭질 4

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 

[풀이]

 

수빈이의 위치 N, 동생의 위치 K가 입력으로 주어지고 수빈이가 동생을 찾는 최단경로를 구하는 문제.

이 때, 수빈이는 현재 위치 X 에서 X-1,X+1,2*X로만 움직일 수 있다.

 

최단경로를 찾아야 하므로 BFS를 사용했다.

현재 위치 X에서  X-1,X+1,2*X로 움직이도록 하였고 visited 배열을 사용해 재방문 하지 않도록 했다.

또한 경로도 구해야 parent 배열을 사용해 해당 index에 오기 전 index 값을 저장했다.

 

처음의 input의 범위가 0부터 100,000 사이라서 MAX 값을 100,001로 설정하였는데

5001 100000과 같은 경우 

 

최단 경로를 구하기 위해 100,000을 넘어가는 경우도 있으므로 MAX 값을 200,001로 변경하였다.

 

 

[코드]

 

시간 : 20 ms

 

#include <iostream>
#include <queue>
#define MAX 200001

using namespace std;

int n[2] = {-1,1};
int visited[MAX]={0,};
int parent[MAX]={0,};
int N,K;
vector <int> ans;

void bfs()
{
    queue<int> q;
    q.push(N);
    
        int idx = q.front();
        q.pop();
        
        if(idx == K ){
            cout << visited[idx] << "\n";
            while(idx != N){
                ans.push_back(idx);
                idx= parent[idx];
            }
            ans.push_back(N);
            return ;
        }
        for(int i=0;i<3;i++){
            int nidx =0;
            if(i==2)    nidx = idx*2;
            else nidx = idx+n[i];
            
            if(nidx < 0 || nidx > MAX || visited[nidx] ) continue;
            
            q.push(nidx);
            visited[nidx]=visited[idx]+1;
            parent[nidx] = idx;
        }
    }

int main(void)
{
    cin >> N >> K;
    bfs();
    int _size = ans.size()-1;
    for(int i=_size; i>=0 ; i--)
        cout << ans[i]<< " ";
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2931번. 가스관  (0) 2021.01.05
[백준]1756번. 피자 굽기  (0) 2021.01.04
[백준] 2589. 보물섬  (0) 2021.01.01
[백준] 5427번. 불  (0) 2020.12.31
[백준] 2146번. 다리 만들기  (0) 2020.12.30