문제 : https://www.acmicpc.net/problem/13549
BFS DP
단순 BFS 탐색으로 문제를 해결하려하면, 순간이동을 하는 경우가 시간초가 0초 이므로 문제를 해결할 수 없습니다. 따라서, 순간이동을 하는 경우들을 먼저 큐에 push 해주는 방식으로 BFS 탐색을 진행하거나 혹은 BFS + DP 를 활용해서 문제를 해결 할 수 있습니다.
1) 순간이동을 먼저 push 해주는 방식의 BFS
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool visited[200000 + 1];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, K;
cin >> N >> K;
queue<pair<int, int>> q;
q.push({ N, 0 });
visited[N] = 1;
while (!q.empty()) {
pair<int, int> cur = q.front(); q.pop();
if (cur.first == K) {
cout << cur.second << '\n';
break;
}
if (0 <= cur.first - 1 && !visited[cur.first - 1]) {
q.push({ cur.first - 1, cur.second + 1 });
visited[cur.first - 1] = 1;
}
if (cur.first + 1 <= K && !visited[cur.first + 1]) {
q.push({ cur.first + 1, cur.second + 1 });
visited[cur.first + 1] = 1;
}
if (cur.first * 2 <= 200000 && !visited[cur.first * 2]) {
q.push({ cur.first * 2, cur.second });
visited[cur.first * 2] = 1;
}
}
return 0;
}
2) 이동하거나 순간이동하거나 순서를 신경쓰지 않고 BFS + DP 활용
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int visited[200000 + 1];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, K;
cin >> N >> K;
for (int i = 0; i < 200001; i++)
visited[i] = 99999999;
queue<pair<int, int>> q;
q.push({ N, 0 });
visited[N] = 0;
while (!q.empty()) {
pair<int, int> cur = q.front(); q.pop();
if (cur.first == K) {
cout << visited[K] << '\n';
break;
}
if (cur.first * 2 <= 200000 && cur.second < visited[cur.first * 2]) {
q.push({ cur.first * 2, cur.second });
visited[cur.first * 2] = cur.second;
}
if (0 <= cur.first - 1 && cur.second + 1 < visited[cur.first - 1]) {
q.push({ cur.first - 1, cur.second + 1 });
visited[cur.first - 1] = cur.second + 1;
}
if (cur.first + 1 <= K && cur.second + 1 < visited[cur.first + 1]) {
q.push({ cur.first + 1, cur.second + 1 });
visited[cur.first + 1] = cur.second + 1;
}
}
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 1300 : K번째 수 - travelbeeee (0) | 2020.04.13 |
---|---|
[BOJ] 2660 : 회장뽑기 - travelbeeee (0) | 2020.04.12 |
[BOJ] 4485 : Obstacle Course - travelbeeee (0) | 2020.04.10 |
[BOJ] 16953 : A -> B - travelbeeee (0) | 2020.04.10 |
[BOJ] 2529 : 부등호 - travelbeeee (0) | 2020.04.10 |