입출력 단계의 A/B 문제를 풀어보자

1008 A/B

위 문제는 단계별 문제 중 입출력 단계의 문제이다. A와B를 나누어 값을 출력해보는 문제이다.

현재 업무에서 C++을 언어를 주 언어로 하다보니, C++로 모든 것을 연습하고자한다. 따라서 이번 문제도 C++를 보고 풀었으나, 다른 사람들이 푼 소스코드를 보거나, 지식이 부족한 부분에 대해 추가적으로 정리하고자 한다.

문제

A/B는 A, B를 입력받아 두 수를 나눈 결과 값을 출력해주면 된다.

아래의 결과값을 출력하자 문제 입력과 출력

문제 풀이

단순하게 풀 수 있는 문제이다. A,B를 입력받아 그냥 나눈 결과 값을 출력해주면 된다. 다만, 조건이 하나 붙어있다.

실제 정답과 출력값의 절대오차 또는 상대오차가 10^-9 이하이면 정답이다

위의 조건을 만족하도록 출력해야한다. 스페셜저지 문제로 10^-9 이하이면 모든 답을 정답으로 처리한다. 이 말인 즉, 최소 소수점 이하 9자리까지는 뽑아야한다는 뜻이다.

#include <iostream>

using namespace std;

int main()
{
  double a,b;
  cin >> a >>b;
  cout.precision(19);
  cout << a/b;
}

코드를 보면, 나는 소수점 자리를 다 세어 19자리까지 출력을 해보았다. 어차피 스페셜 저지 문제로 9자리까지만 출력해줘도 된다. 코드에서 중요한 부분은 precision() 부분이다. precision 부분은 따로 정리를 했다. 여기를 클릭해 관련 포스팅을 보자.

인사이트

다른 사람들 코드를 비교해보니, 비슷하게 푼 사람들이 많이 존재하였다. 다만, 아래의 코드와 같이 푼 사람들이 많이 있었다. 아래의 코드를 보면, printf문의 서식문자를 지정하는 부분에 자리수를 지정해주는 방법이 있다. 저렇게 풀 경우 속도 측면 가독성 측면에서 더 좋을 것 같다는 생각을 해보았다. 솔직히 속도 측면에서는 그렇게 많이 걸리지 않겠지만, 함수를 한번 더 호출하는 것 보다는 더 낫지 않을까? 그런 생각을 해보았다.

#include <cstdio>
main(){double a,b;scanf("%lf%lf",&a,&b);printf("%.9lf",a/b);}