[BOJ: 16953] - Python / 파이썬 - A -> B

o_jooon_·2024년 1월 29일
0

BOJ

목록 보기
13/49
post-thumbnail

서론

그리디 문제입니다.
A를 B로 만드는 방법을 찾는 방법과 B를 A로 만드는 방법이 있습니다.
후자의 경우가 훨씬 간단하고 쉽기 때문에 모두 후자로 푸는거 같습니다.
A를 B로 만들기 위해선 A에 2를 곱한 경우와 1을 추가한 경우 모두 방문여부를 확인하고 이것저것 계산하여 B가 최종적으로 되는지 계산해야 하고,
B를 A로 만들기 위해선 B가 2가 곱해져 있는지(짝수인지)와 일의자리가 1인지만 계산하여 연산을 해주고 두 경우가 모두 아니면 A를 만들 수 없기에 -1을 출력하고 종료할 수 있습니다.

난이도

실버 2


문제

조건

시간 제한메모리 제한
2 초512 MB

정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.

2를 곱한다.
1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.


입력

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


출력

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


예시

예제 입력 1

2 162

2 → 4 → 8 → 81 → 162

예제 출력 1

5

예제 입력 2

4 42

예제 출력 2

-1

예제 입력 3

100 40021

100 → 200 → 2001 → 4002 → 40021

예제 출력 3

5

풀이

b를 a로 만드는 방법으로 문제를 해결하였다.

  1. 문제의 조건에 따르면, b는 무조건 짝수이거나 일의자리가 1이어야 한다.
    그렇기에 두 경우가 아니면 b는 절대로 a가 될 수 없다.
    (a에서 2를 곱하거나 1을 뒤에 추가하는 경우밖에 없기 때문)
  2. 두 가지의 조건 모두 만족하지 않는 다면 break로 반복문을 끝낸다.
  3. 두 가지의 조건 중 하나라도 만족하면 경우에 맞게 b를 연산하고 연산 수를 증가한다.
  4. 반복문이 끝난 경우, a와 b가 같다면(정상적으로 조건에 맞는 연산을 계속해서 했다면) 연산 수를
    a와 b가 다르다면(break로 탈출이 됐다면) -1을 출력한다.

코드

a, b = map(int, input().split())
ans = 1					# 문제에 따르면 최소 연산값에 1을 더해야 함

while a < b:			# 조건식은 b로 해도 되고 a != b로 해도 상관없음
    if b % 2 == 0:		# b가 짝수라면 2로 나눔
        b //= 2
    elif b % 10 == 1:	# b의 일의자리가 1이라면 10으로 나누어 1 제거
        b //= 10
    else:				# a가 b와 같아지려면 위 두 조건을 무조건 성립해야 하기에, 성립하지 않으면 답은 -1
        break

    ans += 1			# 연산 카운트 증가

print(ans if a == b else - 1)	# while문이 break에 걸린 경우 a와 b가 같지 않기에 -1이 출력

실행 결과

profile
안녕하세요.

0개의 댓글