
내가 생각했을때 문제에서 원하는부분
첫째 줄에 정수N이 주어진다.
첫째 줄에 1/2^N의 정확한 값을 소수 형태로 출력한다.
단,
뒤에 불필요한 0을 덧붙여서는 안 된다.
내가 이 문제를 보고 생각해본 부분
이 문제는 2의 N제곱을이용해 1 / 2^N을 출력하는 문제이다.
N을 곱한만큼 소수점 자리수가 정해진다.
BigDecimal 클래스를 이용해 주었다.
BigDecimal 클래스는 고정 소수점 연산을 해주며 십진 표현을 제공하는 클래스이다.
계산된 double 변수를 넣어주며 생성해 준다.
생성된 bd을 이용해 n자리 수까지 소수점을 표기해주며,
반올림을 해준다.
처음에
System.out.println(bd);
를 제출했다. 근데 틀렸습니다 답을 받았다.
System.out.println(bd.toPlainString());
인텔리제이에서는 결과값이 똑같이 나오는데 왜 틀린걸까 곰곰히 생각해봤다. 하지만 내가 해결할 수 없는 것을 알고 이곳 저곳에서 검색을 해보고 chatgpt에게도 물어봤다.
System.out.println(bd);
BigDecimal 객체를 직접 출력하면, Java는 내부적으로 toString() 메소드를 호출한다.
이 경우, 값이 매우 작거나 크면 과학적 표기법으로 출력될 수 있다. 예를 들어, 0.0001은 1E-4와 같이 출력될 수 있다.
bd.toPlainString();
toPlainString() 메소드는 BigDecimal의 값을 문자열로 변환할 때, 과학적 표기법을 사용하지 않고 일반적인 소수점 표기법으로 출력한다.
예를 들어, 0.0001과 같은 값은 그대로 0.0001로 출력된다.
문제에서 요구하는 출력 형식이 일반적인 소수점 표기법일 경우, 과학적 표기법으로 출력되면 정답으로 인정되지 않는다는 것을 알게되었다.
따라서, 정확한 출력 형식이 문제를 통과하는 데 중요하다고 느끼게됐다. bd.toPlainString()을 사용하여 출력 형식을 맞추었기 때문에 정답으로 인정된 것이고, System.out.println(bd);로 출력할 때는 형식이 달라져 틀린 것으로 처리된 것이다.
코드로 구현
package baekjoon.baekjoon_23;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;
// 백준 2052번 문제
public class Main807 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
double ans = Math.pow(0.5, N);
BigDecimal bd = new BigDecimal(ans); // BigDecimal은 고정 소수점 연산을 해주며 십진 표현을 제공
bd = bd.setScale(N, RoundingMode.HALF_UP); // N자리 수까지 소수점을 표기, RoundingMode.HALF_UP 반올림
System.out.println(bd.toPlainString());
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.