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
'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글
[백준] 15649 N과 M (1) - 순열 (2) | 2019.09.19 |
---|---|
[BFS] 2206 벽 부수고 이동하기 (0) | 2019.09.12 |
[이진탐색] 1920 수 찾기, Binary search (0) | 2019.08.29 |
[Deque] 5430 AC (백준) (0) | 2019.08.28 |
[Deque] 1021 회전하는 큐 (0) | 2019.08.27 |
댓글