최소횟수라길래 무의식적으로 DFS를 사용해 풀었고 당연하게도 시간초과가 발생했다.
그래서 거꾸로 계산하기로 생각을 해보았고 K가 홀수면 -1, K가 짝수면 /2를 하려 했는데 예시 2에서 8에서 7로 -1 하지 않고 4로 나누어서 무한루프에 빠지는 앙증맞은 찐빠가 발생하는걸 확인해 K/2가 A보다 작아지는 시점부터는 무조건 -1만 반복하도록 했다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
void input_info(int* A, int* K)
{
cin >> *A >> *K;
return;
}
void DFS(int A, int K)
{
int current_A, next_A;
queue <int> q;
int i, j;
int count = 0, q_size;
q.push(A);
while (!q.empty())
{
q_size = q.size();
for (i = 0; i < q_size; i++)
{
current_A = q.front();
q.pop();
for (j = 0; j < 2; j++)
{
if (j == 0)
{
next_A = current_A + 1;
}
else
{
next_A = current_A * 2;
}
if (next_A > K)
{
continue;
}
else if (next_A == K)
{
cout << count + 1 << "\n";
return;
}
else
{
q.push(next_A);
}
}
}
count++;
}
return;
}
void func(int A, int K)
{
int count = 0;
while (A != K)
{
if (K / 2 < A)
{
K = K - 1;
}
else if (K % 2 == 0)
{
K = K / 2;
}
else
{
K = K - 1;
}
count++;
}
cout << count << "\n";
return;
}
void find_answer(int A, int K)
{
//DFS(A, K);
func(A, K);
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int A, K;
input_info(&A, &K);
find_answer(A, K);
return 0;
}