728x90
http://www.acmicpc.net/problem/16953
# 조건
- 정수 A를 B로 바꾸려고하는데 가능한 연산은 아래 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
- A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
# 접근 방법
- 만들 수 없는 경우에는 -1을 출력한다.
- B+1만큼의 빈 리스트를 만들어서 BFS 탐색해준다.
- A에서 2를 곱한 수와 1을 오른쪽에 추가한 수에 현재 카운트를 기록해주며
- B를 만난 경우 종료 해준다.
모든 숫자에 대해 리스트에 기록해주니 입력이 커서 메모리초과
import sys
sys.stdin = open('input.txt')
from collections import deque
input = sys.stdin.readline
a, b = map(int, input().split())
bfs = [-1] * (b+1)
bfs[a] = 1
q = deque()
q.append(a)
while q:
num = q.popleft()
now_num = num*2
if now_num <= b and bfs[now_num] < 0 :
q.append(now_num)
bfs[now_num] = bfs[num] + 1
c = str(num) + str(1)
new_num = int(c)
if new_num <= b and bfs[new_num] < 0 :
q.append(new_num)
bfs[new_num] = bfs[num] + 1
print(bfs[b])
- 따라서 deque에 카운트 값을 넣어주는 걸로 대체
- b를 만들 수 있다면 flag = True 로 변경해주어 cnt 출력
- 아니라면 -1 출력
import sys
sys.stdin = open('input.txt')
from collections import deque
input = sys.stdin.readline
a, b = map(int, input().split())
q = deque()
q.append((a,1))
flag = False
while q:
num,cnt = q.popleft()
now_num = num*2
if num == b:
flag = True
break if now_num <= b:
q.append((now_num,cnt+1))
c = str(num) + str(1)
new_num = int(c)
if new_num <= b:
q.append((new_num,cnt+1))
if flag:
print(cnt)
else:
print(-1)
728x90
'ALGORITHM > DFS, BFS, 그래프 탐색' 카테고리의 다른 글
[백준 12852번] 파이썬 - 1로 만들기2 (0) | 2023.01.03 |
---|---|
[백준 12851번] 파이썬 - 숨바꼭질2 (0) | 2022.12.24 |
[백준 11725번] 파이썬 - 트리의 부모 찾기 (0) | 2022.12.18 |
[백준 13549번] 파이썬 - 숨바꼭질 3 (0) | 2022.12.09 |
[백준 1967번] 파이썬 - 트리의 지름 (1) | 2022.12.08 |