알고리즘/Python

[백준] 16953 - A -> B

9__bin 2023. 7. 28. 18:14

https://www.acmicpc.net/problem/16953

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

문제 한줄 이해

-A숫자를 2배, A숫자 뒤에 1 붙이기를 해가면서 B가 되기위한 최소 횟수 구하기

 

생각난 풀이

1번째 방법: 숫자의 연산을 해주고 탐색을 진행하는 BFS 아이디어를 떠올려 적용해봤다. 

이유는       A

           2*A   A1    이런식으로 계속 숫자들이 뻗어 나가기 때문이다.

import sys
from collections import deque
#숫자에 1을 붙여주기위해 문자연산이 가능하게 str로
a, b = map(str,sys.stdin.readline().split())

que = deque()
#큐에 횟수와 현재숫자를 담기
que.append((1,a))
result = 0
while que:
    cnt, nownum = que.popleft()
    if nownum == b:
        result = cnt
        break
    #*2연산과 1을 끝에 붙여주는 연산
    for i in (str((int(nownum)*2)),(nownum+"1")):
    # 이미 i가 b보다 크다는건 더이상 탐색할 필요가 없다.
        if int(i) <= int(b):
            que.append((cnt+1,i))
if result == 0:
    print(-1)
else:
    print(result)

정답 처리는 됐지만 형변환 할때에 시간이 꽤나 걸리는걸로 알고있어서 타입을 맞춰줄 생각을 해봤다.

 

2번째 방법: 무작정 문제를 풀려고 들다보니 아주 간단한 방법을 잊고있었다. 숫자에 *10을 해주고 +1을 해주면 되는데 말이다!

import sys
from collections import deque
a, b = map(int,sys.stdin.readline().split())

que = deque()
que.append((1,a))
result = 0
while que:
    cnt, nownum = que.popleft()
    if nownum == b:
        result = cnt
        break
    for i in ((nownum)*2),(nownum*10+1):
        if i <= b:
            que.append((cnt+1,i))
if result == 0:
    print(-1)
else:
    print(result)

'알고리즘 > Python' 카테고리의 다른 글

[백준] 1629 - 곱셈  (0) 2023.07.31
[백준] 1149 - RGB거리  (0) 2023.07.29
[백준] 11725 - 트리의 부모 찾기  (0) 2023.07.24
[백준] 15657 - N과M  (0) 2023.07.23
[백준] 15652 - N과 M  (0) 2023.07.21