알고리즘 관련/BOJ
16953 A → B
Andrew-Yun
2020. 12. 18. 16:04
BFS, DFS로도 풀 수 있는 문제다. DFS는 BFS에 비해 코드가 직관적이고 길이가 짧은게 장점이지만 디버깅이 어렵고 기저사례를 잘 지정해줘야한다.
두 방식을 연습해봐야겠다.
BFS 정답코드
더보기
#include <iostream>
#include <queue>
using namespace std;
long long A, B;
long long nextNum(long long i, long long num)
{
switch (i)
{
case 0:
return num * 2;
case 1:
return num * 10 + 1;
}
}
int main()
{
cin >> A >> B;
if (A == B) {
printf("0\n");
return 0;
}
queue<pair<long long, long long>> q;
q.push({ A, 0 });
long long next = 0;
while (!q.empty()) {
long long num = q.front().first;
long long cnt = q.front().second;
q.pop();
for (long long i = 0; i < 2; i++) {
next = nextNum(i, num);
if (next > B) {
continue;
}
else if (next == B) {
printf("%lld\n", cnt + 2);
return 0;
}
q.push({ next, cnt + 1 });
}
}
printf("-1\n");
return 0;
}
DFS 정답코드
더보기
#include <iostream>
using namespace std;
#define INF 987654321
long long result = INF;
long long A, B;
void dfs(long long num, long long cnt)
{
if (num > B) return;
if (num == B) {
result = cnt;
return;
}
dfs(num * 2, cnt + 1);
dfs(num * 10 + 1, cnt + 1);
}
int main()
{
cin >> A >> B;
if (A == B) {printf("0\n"); return 0;}
dfs(A, 0);
printf("%lld\n", result == INF ? -1 : result + 1);
return 0;
}