-
[백준/JAVA] 16953번: A → BAlgorithm 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로 설정하고 반복문을 종료합니다.
- 이는 더 이상 유효한 변환이 불가능한 경우를 처리하기 위함입니다.
'Algorithm' 카테고리의 다른 글
[백준/JAVA] 1931번: 회의실 배정 (0) 2024.07.18 [백준/JAVA] 1541번: 잃어버린 괄호 (0) 2024.07.18 [백준/JAVA] 13305번: 블로그2 (0) 2024.07.17 [백준/JAVA] 13305번: 주유소 (0) 2024.07.17 [백준/JAVA] 20300번: 서강근육맨 (0) 2024.07.17