백준 25418 c++

magicdrill·2024년 4월 2일

백준 문제풀이

목록 보기
244/673

백준 25418 c++

최소횟수라길래 무의식적으로 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;
}

0개의 댓글