백준 온라인 저지, 그리디 / 16953번: AB (파이썬 / , 백준 실버문제)
2021. 12. 6. 23:30ㆍ알고리즘/그리디
728x90
반응형
문제
정수 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
접근 방법
- 연산 조건에 따라 queue에 값을 삽입하고 빼면서 값을 키로 하고 연산 횟수를 밸류로 하는 딕셔너리를 활용하여 만든다.
코드
# https://www.acmicpc.net/problem/16953
# 접근방법
# 연산 조건에 따라 queue에 값을 삽입하고 빼면서 값을 키로 하고 연산 횟수를 밸류로 하는 딕셔너리를 활용하여 만든다.
from collections import deque
a, b = map(int, input().split()) # a, b 입력
count_dic = {a:1} # 연산횟수 계산용 딕셔너리
queue = deque([]) # 연산횟수 계산을 위한 queue
queue.append(a)
result = -1 # 결과값 초기화
while queue: # queue가 없어질때까지 반복
x = queue.popleft()
if int(str(x) + str(1)) < b: # x에서 뒤에 1을 더한 값이 b보다 작은 경우
queue.append(int(str(x) + str(1))) # 이를 queue에 삽입하고
count_dic[int(str(x) + str(1))] = count_dic[x] + 1 # 연산횟수를 딕셔너리에 저장한다.
elif int(str(x) + str(1)) == b: # x에서 뒤에 1을 더한 값이 b와 같은 경우
result = count_dic[x]+1 # result에 값을 입력하고
break # 반복문을 종료한다.
if x * 2 < b: # x * 2가 b보다 작은 경우
queue.append(x*2) # 이를 queue에 삽입하고
count_dic[x*2] = count_dic[x] + 1 # 연산횟수를 딕셔너리에 저장한다.
elif x * 2 == b: # x * 2가 b와 같은 경우
result = count_dic[x]+1 # result에 값을 입력하고
break # 반복문을 종료한다.
print(result) # 결과 값 출력
728x90
반응형
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 1911번: 흙길보수하기 (파이썬 / , 백준 실버문제) (0) | 2021.12.07 |
---|---|
백준 온라인 저지, 그리디 / 19941번: 햄버거분배 (파이썬 / , 백준 실버문제) (0) | 2021.12.07 |
백준 온라인 저지, 그리디 / 2810번: 컵홀더 (파이썬 / ) (0) | 2021.12.04 |
백준 온라인 저지, 그리디 / 15904번: UCPC는무엇의약자일까 (파이썬 / , 백준 브론즈문제) (0) | 2021.12.02 |
백준 온라인 저지, 그리디 / 1343번: 폴리오미노 (파이썬 / , 백준 브론즈문제) (0) | 2021.12.02 |