알고리즘/boj

BOJ 16953 A -> B

칼퇴시켜주세요 2023. 1. 1. 21:19
728x90

다음 두가지 조건을 역으로 계산 하여 B 에서 A로 만들수 있는지 없는지 찾아가면 된다.

 

이때 중요한점은 B가 홀수 인지 짝수 인지 판단하고, 홀수일경우 일의 자리가 1 인지 아닌지 확인하고 1이 아닐경우 A를 절때 만들 수 없다는 것을 찾아내면 된다. 만약 B가 짝수라면 2로 계속 나눠준면된다.

 

위의 조건을 적용하여 새로 만들어진 B`이 A보다 작아진경우 반복문을 멈추고 A와 B`이 같을경우 결과에 1을 더해준다.

#include<iostream>
#include<string>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int a, b;

	cin >> a >> b;

	int result = 0;
	while(b > a)
	{
		if(b % 2 == 1)
		{
			string s = to_string(b);
			if(s[s.size() - 1] == '1')
			{
				s = s.substr(0, s.size() - 1);
				b = stoi(s);
				result++;
				if(b < a)
				{
					result = -1;
					break;
				}
				else
				{
					continue;
				}
			}
			else
			{
				result = -1;
				break;
			}
		}
		else
		{
			b /= 2;
			result++;
			if(b < a)
			{
				result = -1;
				break;
			}
		}
	}

	if(a == b)
	{
		result++;
	}
	
	cout << result;
}

또 다른 풀이는 A를 기준으로 조건(A*2 또는 A의 가장 오른쪽에 1을 추가)을 적용하여 A==B일때 까지 찾아가고 A > B 일 경우 만들수 없음을 표시해준다. 

#include <iostream>
#include <algorithm>
using namespace std;

const long long imp = -987654321;

int go(long long a, long long b) {
  if (a == b) return 1;
  if (a > b) return imp;
  return max(go(a*2, b) + 1, go(a*10+1, b) + 1);
}

int main() {
  long long a, b;
  cin >> a >> b;
  int ans = go(a, b);
  if (ans < 0) {
    cout << -1 << '\n';
  } else {
    cout << ans << '\n';
  }
  return 0;
}
반응형

'알고리즘 > boj' 카테고리의 다른 글

BOJ 1285 동전 뒤집기  (0) 2023.01.05
BOJ 14916 거스름돈  (0) 2023.01.03
BOJ 1744 수 묶기  (0) 2022.12.31
BOJ 1339 단어 수학  (0) 2022.12.30
BOJ 1541 잃어버린 괄호  (0) 2022.12.30