https://www.acmicpc.net/problem/16953
16953번: A → B
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
www.acmicpc.net
문제 정리
A => B
1. 2를 곱한다.
2. 1을 수의 가장 오른쪽에 추가
1, 2의 연산을 반복해서 A => B로 바꾸는데 필요한 연산의 최솟값 + 1 or -1 출력
문제 접근
그리디라는 생각은 들었지만 2번 연산이 좀 까다롭다고 느껴졌다.
top-down방식을 사용해 B를 A로 만든다고 가정하면,
일의 자릿수가 1이라면 1을 제거 그렇지 않다면 2로 나누기
코드
시간 초과
import sys
input = sys.stdin.readline
cnt = 1
A, B = map(int, input().split())
# 반복문 탈출하려면..?
while B != A:
if B % 10 == 1:
B //= 10
elif B % 2 == 0:
B //= 2
cnt += 1
if B < A:
print(-1)
break
if B == A:
print(cnt)
수정
import sys
input = sys.stdin.readline
cnt = 1
A, B = map(int, input().split())
# 반복문 탈출하려면..?
while True:
if A == B:
break
elif A > B:
cnt = -1
break
elif B % 10 == 1:
B //= 10
cnt += 1
elif B % 2 == 0:
B //= 2
cnt += 1
else:
cnt = -1
break
print(cnt)
'알고리즘 > 백준' 카테고리의 다른 글
세그먼트 트리(Segment Tree) & [백준]2042 구간합(Python) (0) | 2024.02.15 |
---|---|
[백준]11437 LCA(Python) (0) | 2024.02.14 |
[백준]16927 배열 돌리기2(Python) (0) | 2024.02.04 |
[백준]2096 내려가기(Python) (1) | 2024.02.03 |
[백준]3665 최종순위(Python) (1) | 2024.01.30 |