[BOJ][백준 16953] A -> B - C++
2023. 5. 16. 17:29ㆍIT이모) 알고리즘 문제풀이/백준 문제풀이
https://www.acmicpc.net/problem/16953
16953번: A → B
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
www.acmicpc.net
백준 사이트의 16953번 문제, A -> B 문제다.
본인은 C++로 문제풀이를 진행하였다.
0. 문제 읽기
- 백준 12919 문제인 A와 B 2 문제와 비슷한 문제라 풀어보았다.
- 12919 문제의 풀이는 다음으로
1. 문제풀이 아이디어
- 아이디어가 같다. 결국 큰수에서 작은수로 수렴시키는 것이 포인트!
- 재귀의 방향을 어떻게 하느냐에 따라 코드의 성능이 천차만별로 변하는 경우이다.
- 주어진 조건을 틀어서 더 효율적인 방식으로 생각해보는 문제.
2. 코드 핵심 부분
1) 문제 풀이의 전부인 재귀함수,
N에서 M으로 가는 것이 아닌 M에서 N으로 가는 것을 확인할 수 있다.
확실히 골드 난이도 문제인 12919 문제보다 숫자라 구현이 용이한 것을 볼 수 있다.
// 재귀적으로 M을 N으로 바꿔주는 함수
void solve(int N, int M, int lv) {
// N과 M이 같아지면 찾은 것이다. 최소값 비교
if (N == M) {
if (lv < Min) {
Min = lv;
Ans = lv;
}
return;
}
// 만약 M이 N보다 작아지면 실패, return
if (N > M) {
return;
}
// 만약 짝수면 2로 나눠주며 체크
if (M % 2 == 0) {
solve(N, M / 2, lv + 1);
}
// 만약 1의자리가 1이면 이를 제거하며 체크
if (M % 10 == 1) {
solve(N, M / 10, lv + 1);
}
}
3. 전체 코드
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
// 필요 인자들
int sN, sM;
int Min = 21e8;
int Ans = -1;
// 값 입력받는 함수
void input() {
cin >> sN >> sM;
}
// 재귀적으로 M을 N으로 바꿔주는 함수
void solve(int N, int M, int lv) {
// N과 M이 같아지면 찾은 것이다. 최소값 비교
if (N == M) {
if (lv < Min) {
Min = lv;
Ans = lv;
}
return;
}
// 만약 M이 N보다 작아지면 실패, return
if (N > M) {
return;
}
// 만약 짝수면 2로 나눠주며 체크
if (M % 2 == 0) {
solve(N, M / 2, lv + 1);
}
// 만약 1의자리가 1이면 이를 제거하며 체크
if (M % 10 == 1) {
solve(N, M / 10, lv + 1);
}
}
void output() {
cout << Ans;
}
// 메인함수
int main() {
// input
input();
// solve
solve(sN, sM, 1);
// output
output();
return 0;
}
4. 문제 풀이를 마치며..
사실 실버 문제는 잘 포스팅 안하지만,
우연히 이전에 포스팅한 문제와 이어지는 문제를 풀게되어 올리게 되었다.
제목을 안보고 푸는지라 아무생각 없이 문제를 딱 봤는데
왜인걸.
그때 내 발목을 약간 잡았던 문제를 숫자로 바꿔놓은것 뿐이었다.
점점 많고 다양한 문제들을 풀어서
실제 코딩테스트에서 이런 경험을 하게된다면 정말 좋겠다.
'IT이모) 알고리즘 문제풀이 > 백준 문제풀이' 카테고리의 다른 글
[BOJ][백준 1753] 최단경로 구하기 - C++ (0) | 2023.05.18 |
---|---|
[BOJ][백준 1916] 최소비용 구하기 - C++ (0) | 2023.05.17 |
[BOJ][백준 12919] A와 B 2 - C++ (0) | 2023.05.11 |
[BOJ][백준 13549] 숨바꼭질 3 - C++ (0) | 2023.05.10 |
[BOJ][백준 2668] 숫자고르기 - C++ (0) | 2023.05.09 |