백준 16953번 (C++)

2021. 8. 6. 22:03Algorithm/알고리즘 스터디(2021)

반응형

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

 

16953번: A → B

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

www.acmicpc.net

1. 문제

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
2를 곱한다.
1을 수의 가장 오른쪽에 추가한다. 

A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.

 

2. 입력 / 출력

 가. 입력

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

 나. 출력

A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.

 

3. 알고리즘

  • 거꾸로 생각하면 된다. B가 1로 끝나면 그 전 숫자는 B에서 1을 빼고 10으로 나눈 몫이고, B가 짝수이면 그 전 숫자는 B를 2로 나눈 몫이다.

 

4. 전체 코드

#include <stdio.h>

int main() {
	int A, B, count = 0;

	scanf_s("%d %d", &A, &B);

	while (B > A) {
		if (B % 2 == 0) {
			B = B / 2;
			count += 1;
		}
		else if (B % 10 == 1) {
			B = B / 10;
			count += 1;
		}
	}

	if (B == A) {
		printf("%d\n", count + 1);
	}
	else printf("%d\n", -1);
}

 

5. 코드 세부 설명

 가. 변수 선언

int main() {
	int A, B, count = 0;
  • A : 정수 A (1 ≤ A < B ≤ 10^9)
  • B : 정수 B (1 ≤ A < B ≤ 10^9)
  • count : 계산 횟수

 나. 계산하는 부분

	scanf_s("%d %d", &A, &B);

	while (B > A) {
		if (B % 2 == 0) {
			B = B / 2;
			count += 1;
		}
		else if (B % 10 == 1) {
			B = B / 10;
			count += 1;
		}
	}

	if (B == A) {
		printf("%d\n", count + 1);
	}
	else printf("%d\n", -1);
}

 B가 A보다 클 동안만 계산을 하면 된다. 앞서 말했듯, B가 짝수이면 2로 나눈 몫을 구하면 되고 B가 1로 끝나면 10으로 나눈 몫을 구하면 된다.

 계산을 다 했을 때 B의 값이 A의 값과 같으면 count에 1을 더한 값을 출력하면 되고, A와 같지 않으면 -1을 출력하면 된다.

반응형

'Algorithm > 알고리즘 스터디(2021)' 카테고리의 다른 글

백준 9251번 (C++)  (0) 2021.08.14
백준 1309번 (C++)  (0) 2021.08.07
백준 10164번 (C++)  (0) 2021.08.06
백준 2780번 (C++)  (0) 2021.07.30
백준 1946번 (C++)  (0) 2021.07.29