이것저것

BOJ - 1697. 숨바꼭질 본문

Problem Solving

BOJ - 1697. 숨바꼭질

nays111 2021. 1. 20. 01:55

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

예제 입력 1

5 17

예제 출력 1

4

풀이 과정

  • 문제에서 가장 빠른 시간을 출력한다고 하여 최단거리를 구할 수 있는 BFS 탐색으로 문제에 접근하였습니다.

ex) 5 → (4,6,10) → (4 : 3,5,8 6 : 5, 7, 12 10 : 9,11,20) → .... 식으로 가지가 계속 퍼지게 되면 트리형태의 모양이 됩니다.

  • 이 때, 이전에 나왔던 수에 대해서는 더 이상 탐색할 필요가 없으므로 VISIT 배열을 따로 만들어 방문 체크를 해주면 됩니다.
  • 만약 방문하지 않았던 수이면 큐에 N-1, N+1, N*2 를 각각 삽입해주면 됩니다.
if(cur-1>=0 && visit[cur-1]==false){
            q.push(make_pair(cur-1,result+1));
            visit[cur-1]=true;
        }
        if(cur+1<MAX && visit[cur+1]==false){
            q.push(make_pair(cur+1,result+1));
            visit[cur+1]=true;
        }
        if(cur*2<MAX && visit[cur*2]==false){
            q.push(make_pair(cur*2,result+1));
            visit[cur*2]=true;
        }
  • 이 때, 각 범위에 주의해서 조건문을 작성해주어야합니다.

(조건문에서 cur2 < MAX 와 visit[cur2]==false 의 순서를 바꿨더니 visit 배열의 범위를 초과하여 OutOfBounds 에러 발생하였음)


전체 소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <stack>
#include <queue>
#include <map>
#include <functional>
using namespace std;

#define MAX 100001

bool visit[MAX];
int bfs(int start,int target){
    queue<pair<int,int>> q;
    q.push(make_pair(start,0));
    visit[start]=true;
    while(!q.empty()){
        int cur = q.front().first;
        int result = q.front().second;
        q.pop();
        if(cur==target){
            return result;
        }
        if(cur-1>=0 && visit[cur-1]==false){
            q.push(make_pair(cur-1,result+1));
            visit[cur-1]=true;
        }
        if(cur+1<MAX && visit[cur+1]==false){
            q.push(make_pair(cur+1,result+1));
            visit[cur+1]=true;
        }
        if(cur*2<MAX && visit[cur*2]==false){
            q.push(make_pair(cur*2,result+1));
            visit[cur*2]=true;
        }
    }
}
int main(){
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    int n,k;
    cin>>n>>k;
    cout<<bfs(n,k);
    return 0;

}

'Problem Solving' 카테고리의 다른 글

BOJ - 7576. 토마토  (0) 2021.01.20
BOJ - 7562. 나이트의 이동  (0) 2021.01.20
BOJ - 2468. 안전 영역  (0) 2021.01.19
BOJ - 1743. 음식물 피하기  (0) 2021.01.19
BOJ - 10026. 적록색약  (0) 2021.01.19
Comments