문제
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 10^9)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
내가 푼 풀이
- B를 역순으로 가능한 두가지의 역연산을 한다.
- B의 최댓값이 10^9이므로 UInt64에 담아서 연산한다.
- A에서 두가지연산을 했을때 결과값이 중복이 될 수 없다.
- 2의 배수의 끝자리는 1이 될 수 없고, 뒷자리가 1이면 2의배수가 아니기때문이다.
import Foundation
let input = readLine()!.split(separator: " ").map{ UInt64($0)! }
var a = UInt64(input[0])
var b = UInt64(input[1])
var result = 1
while b != a {
if b < a {
result = -1
break
}
if b % 2 == 0 {
b /= 2
} else if b % 10 == 1 {
b /= 10
} else {
result = -1
break
}
result += 1
}
print(result)
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-1339 단어수학 Swift (0) | 2023.05.15 |
---|---|
BOJ-1439 뒤집기 Swift (0) | 2023.05.08 |
BOJ-1946 신입 사원 Swift (0) | 2023.05.07 |
BOJ-1715 카드 정렬하기 Swift (0) | 2023.05.06 |
BOJ-10610 30 Swift (0) | 2023.05.05 |