Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스 #sql #mysql #코딩테스트
- 백준 #이거다시풀기
- 백준 #백준알고리즘 #알고리즘 #코딩테스트 #코딩테스트준비 #코테준비 #백준2110 #python #문제풀이
- 카카오 #프로그래머스 #python #코딩테스트 #오픈채팅방
- 프로그래머스 #NULL 처리하기
- 프로그래머스 #네트워크 #c++ #코딩테스트 #코테 #코테준비 #dfs
- 프로그래머스 #python #2021카카오 #카카오코테 #카카오인턴쉽
- 백준 #백준2217 #백준로프 #python
- 동
- 프로그래머스 #c++ #코딩테스트
- 그리디알고리즘 #그리디 #백준 #우선순위큐 #최소힙 #최대힙 #알고리즘 #코딩테스트 #python
- 프로그래머스 #python #코딩테스트 #코테공부 #알고리즘 #dict
- 카카오 코테
Archives
- Today
- Total
say repository
[백준] 16953 A -> B python 본문
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 |