BOJ

(C++) BOJ/백준 1008 - A/B

정영주 2021. 3. 28. 13:59

문제 출처 : BOJ 1008 - A/B https://www.acmicpc.net/problem/1008

 

 

두 정수를 나눈 값을 출력하는 문제이다.

정답과 출력값의 오차가 10^(-9) 이하여야 한다고 한다.

 

C언어에서라면 printf()를 사용하여 %.10f라고 썼을 것이다.

C++에서 cout을 사용하는 경우에는 어떻게 출력해야 하는지 고민을 거듭한 끝에,

윈도우 프로그래밍 시간에 배운 <iomanip> 라이브러리의 setprecision() 함수를 사용해보았다.

setprecision(p) 함수실수 유효 숫자 자릿수를 p로 지정하는 함수이다.

소수점을 제외한 숫자부분이 p만큼 출력되는 것이다.

소수점 아래부분이 나누어 떨어지는 경우에는 더이상 출력을 하지 않는다. (ex) 입력 4 5 출력 0.8)

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	int a, b;
	cin >> a >> b;
	cout << setprecision(10) << (double)a / b << endl;
	return 0;
}

 

소스 코드를 작성해본 후에 setprecision() 함수에 대해서 찾아보다가 fixed 라는 것을 발견했다.

setprecision() 앞에 fixed를 쓰면 setprecision(p)에서 p를 소수점 아래 자릿수로 지정할 수 있다.

정수 부분이 몇 자리가 나오는지에 상관없이 소수점 아래 자릿수만 설정할 수 있는 것이다.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	int a, b;
	cin >> a >> b;
	cout << fixed << setprecision(9) << (double)a / b << endl;
	return 0;
}

이렇게 쓰면 된다.

그 대신, 이 친구는 소수점 아래부분이 나누어 떨어지는 경우에 지정한 자릿수만큼 0을 그대로 출력한다.

(ex) 입력 4 5 출력 0.800000000)

 

 

수업 시간에 <iomanip> 라이브러리 안에 setprecision() 함수 외에도 setw(), setfill() 함수가 있다는 것을 배웠는데,

setw(w)최소 출력 폭을 w로 지정하는 것이다.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << setw(5) << 123 << endl;
	return 0;
}

이 코드를 실행하면 앞에 공백두칸이 있는   123이 출력된다.

 

setfill(c)채움(fill) 문자를 c로 지정하는 것이다. 기본 값은 공백이라서 위처럼 출력된 것 같다.

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << setw(5) << setfill('*') << 123 << endl;
	return 0;
}

이 코드를 실행하면 **123이 출력된다.

 

setw() 함수를 사용하다가 좌측 정렬을 할 수 있는 방법도 있을까해서 찾아봤더니,

left라는 걸 앞에 써주면 좌측 정렬이 된다고 한다. 

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << left << setw(5) << setfill('*') << 123 << endl;
	return 0;
}

이 코드를 실행하면 123**이 출력된다.

같은 방식으로 right라고 쓰면 아무것도 쓰지 않았을 때처럼 우측 정렬이 된다.

internal이라는 것도 있었는데 부호는 가장 좌측에, 숫자는 가장 우측에 출력이 된다.