본문 바로가기
문제/백준

c++ 백준_16953_"A → B"

by 나 진짜 못차마 2023. 6. 11.
728x90

https://www.acmicpc.net/problem/16953

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

 

처음 A 기준으로 BFS를 해볼까 했다.

당연히 시간이 너무 오래걸린다.

그래서 B 기준으로 하였다.

B 기준으로 맨 오른쪽에 1이 있다면

1을 지우고,

또는

B 기준으로 2로 나누어 떨어진다면

2를 나누었다.

둘 다 해당하지 않는다면 숫자를 만들 수 없다.

이 방법으로 BFS를 돌렸다.

그리고 더 단순하게 할 방법을 찾아서 단순하게 하였다.

1. BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

typedef struct {
	int x;
	int cnt;
	int size;
}node;

int main(void) {
	int A, B;

	cin >> A >> B;


	queue<node> q;
	
	int t = 1000000000;

	for (; t >= 1; t /= 10) {
		if (B / t)
			break;
	}

	q.push({ B,1,t });

	while (!q.empty()) {
		int x = q.front().x;
		int cnt = q.front().cnt;
		int size = q.front().size;
		q.pop();

		//cout << x << " , " << size << '\n';
		if (x == A) {
			cout << cnt;
			return 0;
		}

		if (x == 0) {
			cout << -1;
			return 0;
		}

		int rest = 0;
		int temp = x;
		for (int i = size; i > 1; i /= 10) {
			temp %= i;
		}

		if (temp == 1) {
			q.push({ x / 10,cnt + 1, size / 10 });
		}
		if (x % 2 == 0) {
			if (x / 2 < size)
				size/=10;
			q.push({ x / 2, cnt + 1, size });
		}

	}

	cout << -1;
	return 0;
}

 

2. 단순

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


int main(void) {
	int A, B;

	cin >> A >> B;


	int cnt = 1;

	while (1) {

		if (A == B)
			break;
		
		if (B < A) {
			cout << "-1";
			return 0;
		}

		if (B % 10 == 1) {
			B /= 10;
		}
		else if (B % 2 == 0) {
			B /= 2;
		}
		else {
			cout << "-1";
			return 0;
		}
		cnt++;
	}
	cout << cnt;

	return 0;
}

두 코드다 메모리와 시간이 동일했다.

728x90

'문제 > 백준' 카테고리의 다른 글

c++ 백준_2206_"벽 부수고 이동하기"  (0) 2023.06.13
C++ 백준_2263_"트리의 순회"  (0) 2023.06.13
c++ 백준_1245_"농장 관리"  (0) 2023.06.11
C++ 백준_1629_"곱셈"  (0) 2023.06.11
c++_백준_12865_"평범한 배낭"  (1) 2023.06.11