Algorithm/Java

[백준/JAVA] 16953번: A → B

dbfl9911 2024. 7. 18. 10:06

 

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

 

- 정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int A = Integer.parseInt(st.nextToken()); // 2
        int B = Integer.parseInt(st.nextToken()); // 162

        // 2 → 4 → 8 → 81 → 162
        // 100 → 200 → 2001 → 4002 → 40021

        int count = 1; // 연산 횟수

        while(B != A) {
            // 불가
            if(B < A) {
                count = -1;
                break;
            }
            // 8 → 4
            if(B % 2 == 0) { 
                B /= 2;
            // 81 → 8
            } else if(B % 10 == 1) {
                B /= 10;
            // 그외 불가
            } else{
                count = -1;
                break;
            }
            count++;
        }
        System.out.println(count);
    }
}

- 문제 풀이

1. 연산 횟수 초기화:

int count = 1; // 연산 횟수 (최종 출력 시 1을 더해야 하므로 초기값 1)

연산 횟수를 세기 위해 count 변수를 1로 초기화합니다. (최소한 한 번의 연산은 필요하므로 초기값을 1로 설정합니다.)

 

 

2. B가 A보다 작은 경우

if (B < A) {
    count = -1;
    break;
}

 

  • 만약 B가 A보다 작아지면, A에서 B로 변환하는 것이 불가능합니다. 따라서 count를 -1로 설정하고 반복문을 종료합니다.
  • 예를 들어, A가 100이고 B가 50이 되면, B를 더 이상 줄여도 A가 될 수 없으므로 변환이 불가능합니다.

 

 

3. B가 2로 나누어 떨어질 경우

if (B % 2 == 0) {
    B /= 2;
}

 

 

  • B가 짝수이면, B를 2로 나눕니다. 이는 A에서 B로의 변환에서 2를 곱하는 연산의 역연산입니다.
  • 예를 들어, B가 162이면 2로 나눠서 81이 됩니다.

 

 

4. B의 끝자리가 1인 경우

else if (B % 10 == 1) {
    B /= 10;
}
  • B의 끝자리가 1이면, B에서 1을 제거하고 10으로 나눕니다. 이는 A에서 B로의 변환에서 1을 가장 오른쪽에 추가하는 연산의 역연산입니다.
  • 예를 들어, B가 81이면 10으로 나눠서 8이 됩니다.

 

 

5. 그 외의 경우

else {
    count = -1;
    break;
}

 

 

  • B가 짝수도 아니고 끝자리가 1도 아니면, 변환이 불가능하므로 count를 -1로 설정하고 반복문을 종료합니다.
  • 이는 더 이상 유효한 변환이 불가능한 경우를 처리하기 위함입니다.