https://www.acmicpc.net/problem/1008
문제: 1008번 A/B
문제 풀이(Problem Solve)
// A / B
#include <iostream>
using namespace std;
int main() {
double A, B;
cin >> A >> B;
cout.precision(9);
cout << fixed;
cout << A / B;
return 0;
}
문제 해결 전략(Problem-Solving Strategies)
💡 C와 C++에서 실수를 표현할 때, 선언하는 자료형은 "float"와 "double"이 있습니다.
float는 32비트(4바이트) 자료형이고, double은 64비트(8바이트) 자료형입니다. 즉, float보다는 double이 더 정교한 숫자를 표현할 수 있다는 것입니다. (대신 메모리 공간을 더 차지한다는 단점이 있습니다.)
1008번 문제에서 조건을 보면 상대오차가 $10^{-9}$ 이하이여야 정답이라고 합니다. 그렇기에 상대오차를 더 적게 표현할 수 있는 double형을 사용하여 변수를 선언해야 합니다.
💡 상대오차가 $10^{-9}$ 이하이여야 정답이기에, 출력값을 낼 때 소수점을 최소 9개 이상 나오도록 해야합니다. 이때, 알아야 할 것이 "std::fixed"와 "precision()"입니다.
precision()은 precision 함수에 넘겨주는 인수의 값에 따라 출력되는 수의 자릿수를 정하는 함수입니다. 예를 들어 precision()에 9를 집어넣으면( precision(9) ), 1234.56789와 같은 숫자처럼 정수 부분과 소수 부분을 합쳐 총 9자리의 자릿수로 만들게됩니다. precision() 은 소수점 이후 자릿수를 고정하는 것이 아니라!! 정수 부분과 소수 부분을 합쳐서 자릿수를 만든다는 것을 기억해야 합니다.
소수점 이후 자릿수를 고정하기 위해서 std::fixed를 사용합니다. fixed는 고정 소수점 표현으로 precision에 입력된 인수만큼의 자릿수가 소수점 이후부터 해당되게 만듭니다. fixed를 통해 백준 1008번 문제에서 요구하는 소수점 이후 자릿수를 9개로 맞출 수 있습니다.
std::cout << std::fixed; // 고정 소수점 표현으로 변환시킵니다.
std::cout.unsetf(ios::fixed); // 다시 부동 소수점 표현으로 변환시킵니다.
반응형