728x90
설명
정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.
- 2를 곱한다.
- 1을 수의 가장 오른쪽에 추가한다.
A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.
입력
첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.
출력
A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.
예시 입력1
2 162
예시 출력1
5
예시 입력2
4 42
예시 출력2
-1
예시 입력3
100 40021
예시 출력3
5
풀이
핵심은 B에서 A를 만들어 낸다는 것이다.
B가 A보다 클 때 까지만 반복한다. B의 일의 자리(마지막 숫자)가 1일 때는 10으로 나누고, B의 일의 자리(마지막 숫자)가 짝수일 때는 2로 나눈다. 즉, A에서 B를 만들 때 했던 행위의 반대의 행위를 하면 된다.
A와 B가 같다면 현재 count에서 +1을 한 값을 리턴하고 그렇지 않다면 -1을 리턴한다.
코드
package baekjoon._16953;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int solution(long A, long B) {
int count = 0;
while (B > A) {
if (B % 10 == 1) {
B /= 10; // 마지막 숫자가 1일 때, 10으로 나눔
} else if (B % 2 == 0) {
B /= 2; // B가 짝수일 때, 2로 나눔
} else {
return -1; // 위의 두 경우에 해당하지 않으면 A에서 B를 만들 수 없음
}
count++;
}
if (A == B) {
return count + 1; // A와 B가 같으면 연산 횟수 + 1 반환
} else {
return -1; // 같지 않으면 -1 반환
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
sb.append(solution(A, B));
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}
728x90
'Baekjoon' 카테고리의 다른 글
[백준/자바] 11899번 괄호 끼워넣기 (0) | 2024.04.14 |
---|---|
[백준/자바] 1343번 폴리오미노 (0) | 2024.03.28 |
[백준/자바] 14916번 거스름돈 (0) | 2024.03.27 |
[백준/자바] 1946번 신입 사원 (1) | 2024.03.26 |
[백준/자바] 1439번 뒤집기 (0) | 2024.03.26 |