1. 문제

실수 a의 b제곱을 정확하게 계산하는 문제이다. 지수 연산 문제로, 얼핏 보면 쉬운 문제며 코드도 짧다.
2. 지수 연산
지수 연산이란, 어떤 수를 여러번 곱하는 것을 말한다. 즉, 문제의 제목인 a^b 는 a를 b번 곱한 값이 된다.
- a^0 = 1
- a^1 = a
- a^b * a^c = a^(b+c)
등의 성질이 있다.
3. 풀이
a^b를 정확하게 계산하고 출력하기 위해서 BigDecimal이라고 하는 자바에서 매우 큰 소수나 정수를 정밀히 다룰 수 있는 클래스와 지수 연산을 하기 위해 .pow()를 사용해서 코드를 짰다.
4. 코드
오답 코드 1
import java.util.*;
import java.math.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigDecimal a = sc.nextBigDecimal();
int b = sc.nextInt();
BigDecimal result = a.pow(b);
System.out.println(result);
sc.close();
}
}
BigDecimal을 사용하여 변수를 선언하고 .pow()를 사용해 거듭제곱을 계산했다. 하지만 이 코드를 제출하면 틀렸다고 나온다. 출력 형식이 부정확하기 때문이다. .pow()로 정확한 계산을 할 수 있지만 소수점 자리 수가 많아진다. 예를 들어 0.02342300000 처럼 불필요한 0이 출력될 수 있다. 따라서 이 불필요한 0들을 제거해야한다.
오답 코드 2
import java.util.*;
import java.math.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigDecimal a = sc.nextBigDecimal();
int b = sc.nextInt();
BigDecimal result = a.pow(b).stripTrailingZeros();
System.out.println(result);
sc.close();
}
}
불필요한 0을 .stripTrailingZeros()를 사용하여 제거해주었다. 하지만 이 코드 역시 오답이다.
BigDecimal의 생성 과정에서 부동소수점의 오차를 막기 위해 입력에서 10진수 문자열로 처리해야한다.
정답 코드
import java.util.*;
import java.math.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BigDecimal a = new BigDecimal(sc.next());
int b = sc.nextInt();
BigDecimal result = a.pow(b).stripTrailingZeros();
System.out.println(result.toPlainString());
sc.close();
}
}
new BigDecimal(sc.next())를 사용하여 문자열로 입력을 받았다.
또한 출력문에서 .toPlainString()을 사용함으로써 지수 표기법 없이 출력하게 했다.

감사합니다 (. ❛ ᴗ ❛.)
'Algorithm' 카테고리의 다른 글
| [Algorithm] 그리디 알고리즘 (Greedy Algorithm) + 백준 1931번 (0) | 2025.04.09 |
|---|---|
| [Java] 백준 1914번 : 하노이 탑 (0) | 2025.03.06 |
| [C/Python] 백준 2477번 : 참외밭 (0) | 2025.03.05 |
| [C/C++] 백준 2960번 : 에라토스테네스의 체 (0) | 2025.02.20 |
| [C/C++] 백준 2740번 : 행렬 곱셈 (0) | 2025.02.01 |