본문 바로가기
알고리즘, 자료구조/알고리즘

[백준] 1694 숨바꼭질

by Wordbe 2019. 9. 12.
728x90

 

BFS를 잘 활용하면 되는 문제.

그래프를 잘 생각 해보자.

각 숫자들을 그래프의 노드라고 했을 때,

1만큼 떨어진 이웃하는 숫자는 양방향 간선으로 다 이어져 있고,

x노드에서 2x노드로 가는 간선들이 있다.

BFS는 모든 정점과 간선을 살펴보는 알고리즘이므로 시간복잡도는 O(|V| + |E|)인데,

V = 100,000, E < 300,000 이면 충분할 거라고 생각했다.

 

참고로 memset에 사이즈를 sizeof(d)/sizeof(int) 라고 했다가.... 수없이 실패를 했던 문제이다.

나머지는 최단거리를 구하는 BFS문제로 직관적으로 쉽게 풀 수 있다.

#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;

int d[100001];

int main() {
    int n, k;
    scanf("%d %d", &n, &k);
    memset(d, -1, sizeof(d));
    queue<int> q;
    q.push(n);
    d[n] = 0;
    while(!q.empty()){
        int u = q.front();
        q.pop();
        if (u == k) break;

        int v = u + 1;
        if (v <= 100000 && d[v] == -1) {
            d[v] = d[u] + 1;
            q.push(v);
        }

        v = u - 1;
        if (v >= 0 && d[v] == -1) {
            d[v] = d[u] + 1;
            q.push(v);
        }

        v = 2 * u;
        if (v <= 100000 && d[v] == -1) {
            d[v] = d[u] + 1;
            q.push(v);
        }
    }
    printf("%d\n", d[k]);
    return 0;
}
728x90

댓글