A
, B
: 입력된 정수 ()
✅ 입력 조건
1.A
,B
공백 구분해 입력
✅ 출력 조건
1. 2가지 연산 방법 이용해A → B
로 바꾸는데 필요한 연산 최솟값에 1을 더한 값 출력
2가지의 연산이 있다.
1. 2 곱하기
2. 1을 수의 가장 오른쪽 추가
2가지 연산을 최소로 사용해서 A
를 B
로 만들어야 한다.
2를 곱하는 연산은 숫자를 짝수로 만들고, 1을 추가하는 방법은 숫자의 끝자리는 1로 만든다.
이 점을 기반으로 B
에서 A
가 되는 과정을 역추정할 수 있다.
B
가 짝수라면 2로 나누고, 1로 끝난다면 문자열로 변환해 맨 뒤의 1을 제거한다.
그 후에도 조건에 따라 A
가 될 때까지 연산을 반복하며 횟수를 센다.
A
보다 작다 → A
를 B
로 만들 수 없다는 의미이므로 -1
을 출력한다.A
가 되었다 → 횟수에 1을 더한 수를 출력한다.조건에 따라 2가지 연산 수행 →
BFS 수행 →
최종 시간복잡도
으로, 최악의 경우에도 1초 내로 계산이 가능할 것 같다.
B가 A 될 때까지 조건에 따라 BFS로 연산 수행
# A, B 입력
A, B = map(int, input().split())
temp = B
count = 0
while True:
if temp == A:
print(count + 1)
break
elif temp < A:
print(-1)
break
elif temp % 2 == 0:
temp //= 2
count += 1
elif str(temp)[-1] == '1':
temp = int(str(temp)[0:-1])
count += 1
시간 초과
가 발생했다.# BFS 구현
def bfs(x):
queue = deque([(x, 1)])
# 큐가 빌 때까지 반복
while queue:
x, count = queue.popleft()
if x == A:
return count
if x < A:
return -1
if x % 2 == 0:
x //= 2
count += 1
queue.append((x, count))
if str(x)[-1] == '1':
x = int(str(x)[0:-1])
count += 1
queue.append((x, count))
A
보다 작은 값이 나오면 -1
을 바로 리턴하도록 구현했더니 틀렸다고 나왔다. continue
를 작성하고 전체 함수의 리턴값을 -1
로 했더니 이 에러는 해결되었다.return -1
을 하게 되면 모든 탐색이 완료되기 전에 탐색을 종료될 수 있어 잘못된 결과를 얻을 수 있기 때문에 틀린 것 같다.# BFS 구현
def bfs(x):
queue = deque([(x, 1)])
# 큐가 빌 때까지 반복
while queue:
x, count = queue.popleft()
if x == A:
return count
if x < A:
continue
if x % 2 == 0:
x //= 2
count += 1
queue.append((x, count))
if str(x)[-1] == '1':
x = int(str(x)[0:-1])
count += 1
queue.append((x, count))
return -1
append
할 때 미리 값을 수정한 후에 추가해주니 ValueError
가 발생했다.ValueError
가 발생하는 것이다.import sys
from collections import deque
input = sys.stdin.readline
# A, B 입력
A, B = map(int, input().split())
# BFS 구현
def bfs(x):
queue = deque([(x, 1)])
# 큐가 빌 때까지 반복
while queue:
x, count = queue.popleft()
if x == A:
return count
if x < A:
continue
if x % 2 == 0:
queue.append((x // 2, count + 1))
if str(x)[-1] == '1':
x = int(str(x)[0:-1])
queue.append((x, count + 1))
return -1
# BFS 수행
result = bfs(B)
# 결과 출력
print(result)