본문 바로가기
알고리즘/백준

백준 16953번 A -> B 파이썬 풀이

by 푸딩코딩 2023. 8. 1.
728x90
반응형

A → B 성공

 
 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 512 MB 39711 16395 13073 39.908%

문제

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

  • 2를 곱한다.
  • 1을 수의 가장 오른쪽에 추가한다. 

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

입력

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

출력

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

예제 입력 1 복사

2 162

예제 출력 1 복사

5

2 → 4 → 8 → 81 → 162

예제 입력 2 복사

4 42

예제 출력 2 복사

-1

예제 입력 3 복사

100 40021

예제 출력 3 복사

5

100 → 200 → 2001 → 4002 → 40021

출처

a, b= map(int, input().split())
k=b
cnt=0
while (True):
    if k%10==1:
        k=int(k/10)#끝자리 1인경우 제거하기
        cnt+=1
    else:
        k=k/2 #나눠주기
        cnt+=1
        
    if k==a:
        cnt+=1
        break
    if k<a or k!=int(k):#구할 수 없는 경우
        cnt=-1
        break
        
print(cnt)

어떻게 풀지 고민하다 노트에 적으면서 생각해보는 과정이 도움이 되었던 것 같다. 

A에서 찾지말고, 거꾸로 B에서 찾아가자!

while문에서 B의 끝자리가 1인 경우 1을 제거해준다. 그렇지 않다면 B를 2로 나누어 갱신한다. cnt를 높인다.

만약 그렇게 갱신한 값 k와 a가 같다면 루프를 탈출한다.

그런데 만약 k가 a보다 작아지거나, k가 소수점을 가지게 된다면 A를 구할 수 없기때문에 cnt를 -1로 바꾸고 루프를 탈출한다.

최종적으로 cnt를 출력하고 프로그램을 종료한다. 

 

 

 

728x90
반응형