이 문제는 백준 알고리즘에서 제공하는 나눗셈 연산에 대한 기본 문제이다.
링크 : https://www.acmicpc.net/problem/1008
문제 난이도에 비해 정답 비율이 낮은 것을 볼 수 있는데, 출력 조건을 지키지 않아 그런 것으로 예상된다.
문제 자체는 정말 간단하다. A / B를 구현하되, 오차가 10^-9 이하이기만 하면 되지만, 이 문제에서 얻어가야 하는 내용은 바로 C++에서의 소수점 표현 방법이다.
C++는 입출력 시 기본적으로 표준 라이브러리의 모든 요소가 담겨 있는 std 네임스페이스(namespace) 내부의 cout과 cin을 사용한다.
이는 기존의 C 입출력에 사용되는 printf, scanf 함수와 같은 역할을 수행한다고 생각하면 된다.
여기서 차이점은 cout은 printf와는 다르게 소수점을 출력할 때, precision()이라는 함수를 사용한다는 것이다.
#include <iostream>
using namespace std;
int main () {
cout.precision(9);
cout << "fixed 적용 안한 결과 : " << 100.01234569878 << endl;
cout << fixed;
cout << "fixed 적용한 결과 : " << 100.01234569878 << endl;
// 출력 예시
// fixed 적용 안한 결과 : 100.012346
// fixed 적용한 결과 : 100.012345699
}
예시를 보면 알 수 있지만, precision의 괄호 안에 n으로 유효숫자 자릿수를 명시하고, fixed라는 입출력 조정자를 통해 소수점 이후의 숫자들에서만 유효숫자를 고려하도록 출력값을 고정한다.
여기서 만약 fixed 조정자 없이 precision 함수만 사용하게 될 경우, 정수부와 소수부의 모든 수에 대하여 유효숫자 자릿수를 고려하기 때문에 출력값이 달라질 수 있다.
fixed가 적용되지 않은 경우 정수부까지 고려한 9자리의 숫자이기에 정수부 3자리를 제외한 6자리가 소수부에 표현된 반면, 적용된 경우 소수부에서만 유효숫자를 고려하기에 9자리 모두 소수부에 적용된 것을 확인할 수 있다.
위의 내용을 문제에 적용하면 다음과 같은 정답 코드를 작성할 수 있다.
// 정답 코드
#include <iostream>;
using namespace std;
int main() {
int N = 0, M = 0;
cin >> N >> M; // N = 1, M = 3으로 입력
cout << precision(9); // 소수점 9번 째 자릿수로 고정
cout << fixed;
cout << N / M;
// 출력 예시 → 0.3333333333
}
마지막으로 한 가지 주의해야할 점은 오차의 범주가 10^-9 이하라는 점이다. 따라서 소수점 9번째 자릿수까지 출력해주어야 이후 생략되는 소수부가 절대 10^-9를 넘지 못해 오답이 발생하지 않는다.
'코딩 테스트' 카테고리의 다른 글
[백준] 1205번 : 등수 구하기 (C++) - 실버 4 (0) | 2025.02.10 |
---|---|
[백준] 1018번 : 체스판 다시 칠하기 (C++) - 실버 3 (0) | 2025.02.02 |
[백준] 2839번 : 설탕 배달 (C++) - 실버 4 (0) | 2025.01.31 |
[백준] 2559번 : 수열 (C++) - 실버 3 (1) | 2025.01.30 |
[백준] 20920번 : 영단어 암기는 괴로워 (C++) - 실버 3 (0) | 2025.01.28 |