728x90
문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
코드 1
A,B = map(int,input().split())
cnt = 1
while True:
if B==A:
break
if (B%2!=0 and B%10!=1) or B<A:
cnt=-1
break
else:
if B%10==1:
B=B//10
cnt += 1
else:
B=B//2
cnt+=1
print(cnt)
풀이 1
B->A
B가 A가 될 때까지 2로 나누거나 1의 자릿수가 1이면 1을 없애준다.
A를 못 만들면 -1 return!!
코드 2
from collections import deque
A,B = map(int,input().split())
res = -1
q = deque()
q.append([A,1])
while q:
n,cnt = q.popleft()
if n==B:
res = cnt
break
if n*2<=B:
q.append([n*2,cnt+1])
if int(str(n)+"1")<=B:
q.append([int(str(n)+"1"),cnt+1])
print(res)
풀이 2
A->B : BFS 사용
BFS을 사용하는 방법이 있다. 이는 풀이 1을 풀고 다른 풀이들을 보고 깨달았다.................(코린이 ㅋㅋ)
1) 큐에 A와 연산 횟수를 삽입한다.
2) A가 B가 되기 위한 연산을 하여 큐에 대입한다.
3) B일 때 끝낸다.
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1181 단어정렬 python (0) | 2022.02.12 |
---|---|
[백준 알고리즘] 10989 수 정렬하기3 python (0) | 2022.02.12 |
[백준] 4769 캠핑 python (0) | 2022.02.10 |
[백준] 1715 카드 정렬하기 python (0) | 2022.02.10 |
[백준] 1339 단어 수학 python (0) | 2022.02.10 |