매일 BOJ
(매일 BOJ) C++ 16953번 A -> B
norepinephrine
2025. 8. 27. 15:29
이번 문제는 16953번 A -> B 이다

문제 요약
- 허용 연산
- x → 2x
- x → 10x + 1
- 목표: A에서 시작해 B에 도달하는 최소 단계 수 + 1을 출력 (도달 불가 시 -1)
접근법
- BFS(너비 우선 탐색)
시작값 A를 루트로 상태를 확장합니다. 간선 가중치가 모두 1이므로, 처음 B를 만나는 순간의 레벨이 곧 정답이다- 상태: 현재 값 x
- 간선: x → 2x, x → 10x + 1
- next > B는 확장할 필요가 없으므로 가지치기
- 방문/거리 관리는 map(또는 unordered_map)으로 처리
- (참고) 역방향 그리디(B → A) 도 매우 간단하다 B의 끝이 1이면 /10, 아니고 짝수면 /2, 그 외는 실패
작성코드
#include <bits/stdc++.h>
using namespace std;
int BFS(long long a, long long b);
int main (void){
long long A,B;
cin >> A >> B;
int answer = BFS(A,B);
cout << answer;
return 0;
}
int BFS (long long a, long long b){
queue<long long> q;
map<long long, long long> distance;
q.push(a);
distance[a] = 1;
while(!q.empty()){
long long current = q.front();
q.pop();
if(b == current) return distance[current];
for(long long next : {current*2,current*10+1}){
if(next <= b && !distance.count(next)){
distance[next] = distance[current] + 1;
q.push(next);
}
if(b == next) return distance[next];
}
}
return -1;
}