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
출처
- 문제를 번역한 사람: baekjoon
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
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 1212번 8진수 2진수 파이썬 풀이 (0) | 2023.08.01 |
---|---|
백준 11000번 강의실 배정 파이썬 풀이 heap (0) | 2023.08.01 |
백준 1931번 회의실 배정 파이썬 풀이 (0) | 2023.07.29 |
백준 1965번 상자넣기 파이썬 최장 증가 부분 수열 문제 (0) | 2023.05.21 |
백준 2565번 전깃줄 파이썬 LIS 최장 증가 부분 수열 알고리즘 (0) | 2023.05.20 |