1. 문제 정보
- 문제 번호: 1008번
- 문제 이름: A/B
- 사용 언어: C++
- 문제 링크: 백준 1008번 바로가기
- 문제 요약:단, 실제 정답과 출력값의 절대오차 또는 상대오차가 10^{-9} 이하이어야 한다.
- 두 정수 A와 B를 입력받아 A/B를 출력하는 프로그램을 작성하시오.
2. 접근 방법 (알고리즘)
이 문제는 단순히 나눗셈을 하는 것이 아니라, "얼마나 정밀하게 소수점을 표현할 수 있는가?"를 묻는 문제다.
문제 조건에 오차 범위가 적혀있다. 즉, 소수점 아래 9자리 이상 정확하게 출력해야 한다는 뜻이다.
하지만 C++의 cout은 기본적으로 소수점 6자리까지만 출력하므로, fixed나 setprecision을 사용해 출력 자릿수를 늘려줘야 한다. 더 중요한 것은 변수의 자료형(Data Type) 선택이다.
3. 코드 구현 (C++)
#include <iostream>
#include <iomanip> // setprecision을 쓰기 위해 필요
using namespace std;
int main() {
// float가 아닌 double을 사용해야 함
double a, b;
cin >> a >> b;
// 소수점 유효 자리를 넉넉하게 10자리 이상으로 설정
cout << setprecision(10) << a / b;
return 0;
}
4. 배운 점 & 회고 (TIL)
처음에는 습관적으로 float를 썼다가 틀렸다. 찾아보니 부동 소수점(Floating Point) 자료형의 정밀도 차이 때문이었다.
A. 틀린 이유: float vs double
- float (단정도 부동 소수점): 4바이트(32bit). 유효 자릿수가 약 7자리밖에 안 된다. 문제에서 요구하는 오차 범위를 만족하기엔 정밀도가 부족하다.
- double (배정도 부동 소수점): 8바이트(64bit). 유효 자릿수가 약 15자리다. 알고리즘 문제 풀이에서는 웬만하면 double을 써야 한다.
B. 출력 조작: setprecision
C++에서 단순히 cout << a/b;를 하면 적당히 반올림되어 출력된다.
- #include <iomanip> 헤더를 추가해야 한다.
- cout << setprecision(10): 전체 유효 숫자를 10자리로 맞춘다는 의미다. (또는 fixed와 함께 써서 소수점 아래 자리를 고정할 수도 있다.)
결론
"알고리즘 문제에서 실수(소수)를 다룰 때는 고민하지 말고 무조건 double을 쓰자."
추가 팁! long double도 존재한다.
'알고리즘 문제풀이 > C++' 카테고리의 다른 글
| [백준/C++] 2609번: 최대공약수와 최소공배수 - 브루트 포스 vs 유클리드 호제법 (0) | 2026.02.08 |
|---|---|
| [백준/C++] 1259번: 팰린드롬수 - 투 포인터와 인덱스 조건의 중요성 (0) | 2026.02.04 |
| [백준/C++] 2798번: 블랙잭 - 인간의 직관 vs 컴퓨터의 무식함 (브루트 포스) (0) | 2026.02.04 |
| [백준/C++] 1978번: 소수찾기- 제곱근을 이용한 최적화 (0) | 2026.02.04 |
| [백준/C++] 1152번: 단어의 개수 - 문자열 공백 처리 (0) | 2026.01.28 |