ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 16953번: A → B
    Algorithm 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로 설정하고 반복문을 종료합니다.
    • 이는 더 이상 유효한 변환이 불가능한 경우를 처리하기 위함입니다.

     

     

Designed by Tistory.