A→B
티어 : Silver 1
시간 제한 : 2 초
메모리 제한 : 512 MB
알고리즘 분류 : 그래프 이론, 그리디 알고리즘, 그래프 탐색, 너비 우선 탐색
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (
)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
예제 입출력
Algorithm
Greedy
1. B가 2로 나누어 떨어지면 2로 나누기
2. 그렇지 않고 마지막 숫자가 1이면 1 빼기
3. 마지막 숫자가 1이 아니면 -1 출력
4. A가 만들어지면 횟수 출력
5. A보다 작아지면 -1 출력
Code
A, B = map(int, input().split())
answer = 0
while True:
# B가 2로 나누어 떨어지면 2로 나누기
if B % 2 == 0:
B //= 2
answer += 1
# B가 2로 나누어 떨어지지 않고 마지막 숫자가 1이면 1 빼기
elif str(B)[-1] == '1':
B = int(str(B)[:-1])
answer += 1
# B가 2로 나누어 떨어지지 않고 마지막 숫자가 1이 아니면 -1 출력
else:
print(-1)
break
# B가 A보다 작아지면 -1 출력
if A > B:
print(-1)
break
# A가 만들어지면 횟수 출력
elif A == B:
print(answer+1)
break
메모리: 30840 KB
시간: 72 ms
'백준 > Python' 카테고리의 다른 글
[백준 10844] 쉬운 계단 수 Python (0) | 2022.05.31 |
---|---|
[백준 2468] 안전 영역 Python (0) | 2022.05.31 |
[백준 9372] 상근이의 여행 Python (0) | 2022.05.30 |
[백준 1003] 피보나치 함수 Python (0) | 2022.05.30 |
[백준 1026] 보물 Python (0) | 2022.05.30 |