Computer Science/Algorithm
[백준/Baekjoon] 16953번 A->B (C++)
hilily
2022. 5. 19. 17:08
반응형
#include <iostream>
#include <algorithm>
using namespace std;
long long a, b;
long long min_count = 1000000000;
bool flag = false;
void dfs(long long a, long long cnt) {
if (a > b) return;
else if (a == b) {
flag = true;
min_count = min(min_count,cnt);
}
else if (a < b) {
dfs(a * 2, cnt+1);
dfs((a * 10) + 1, cnt+1);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> a >> b;
dfs(a, 1);
flag == false ? cout << "-1" : cout << min_count;
return 0;
}
고려해야할 점 🤔
- Greedy문제이므로 모든 경우를 탐색하는 것을 목표로 한다.
- 여러가지 경우의 수가 있어도 가장 적은 count로 탐색하는 경우를 선택한다.
😤
생각 정리- 모든 경우를 탐색하는 경우를 그림으로 그려봤을 때, 한 깊이가 추가될 때 마다 수의 가장 끝에 1을 추가하는 것과 수를 2배 하는 2가지로 갈리는 것을 모두 탐색하는 과정은 그래프 탐색과 유사하다고 판단하였다. (사실 재귀와 더 유사한것 같기도.. 😅)
- 그래프에서 가장 깊은 곳 까지 들어갔다가 조건에 부합하지 않으면 다른 방법을 시도 (방법이라 함은 수의 끝에 1을 추가하는 것과 수를 2배하는것.)
- 정말 단순하지만 수의 가장 끝에 1을 추가하는 부분에서 고민이 있었다. (각자리의 수를 하나씩 10배 증가시키는 방법을 생각했는데 그냥 10배를 곱하고 1을 더하는 간단한 방법이 존재했다.!! 다음에 비슷한 문제에서 써먹어야겠다 🤣)
- 알고리즘에서 삼항 연산자를 처음 써보았다. (swift와 작성 방법이 동일하다!! 매우 편리..🙂)
- 전에는 코드가 길어지는 것, 변수가 많아지는 걸 매우 극혐했는데.. 가독성을 위해 flag 변수를 사용해서 나타내 보았다. (보기 더 좋은 것 같다. 안좋은 고정관념은 버려야겠다.)
반응형