세 개의 double 값이 주어졌다고 가정해 보겠습니다. 이 값들을 각각 지정된 형식에 맞게 포맷한 뒤 출력해야 합니다.
첫 번째 값의 정수 부분을 소문자 16진수 형식으로 출력합니다.
두 번째 값은 소수점 둘째 자리까지 출력하며, 양수인지 음수인지 나타내는 부호를 앞에 붙입니다. 출력 폭은 총 15자로 오른쪽 정렬하고, 남는 왼쪽 공간은 밑줄(
_) 문자로 채웁니다.세 번째 값은 소수점 아홉째 자리까지 과학적 표기법(scientific notation)으로 출력합니다.
예를 들어 입력이 256.367, 5783.489, 12.5643295643이라면 출력 결과는 다음과 같습니다.
0x100 _______+5783.49 1.256432956E+01
문제 해결 접근 방법
C++의 iostream 스트림 조작자(manipulator)를 활용하면 원하는 출력 형식을 손쉽게 지정할 수 있습니다. 단계별로 필요한 조작자는 다음과 같습니다.
1. 첫 번째 값: 소문자 16진수 출력
hex: 값을 16진수 형식으로 출력합니다.showbase: 16진수 값에 '0x' 접두사를 붙여 표시합니다.left: 값의 오른쪽에 채움 문자를 삽입해 출력 필드를 채웁니다.nouppercase: 출력을 모두 소문자로 표시합니다.
2. 두 번째 값: 부호와 함께 오른쪽 정렬 출력
right: 값의 왼쪽에 채움 문자를 삽입해 출력 필드를 채웁니다.fixed: 값을 고정 소수점 표기법으로 출력합니다.setw(15): 출력 필드 너비를 15로 설정합니다.showpos: 출력 앞에 '+' 기호를 삽입합니다.setfill('_'): 빈 공간을 밑줄 문자로 채웁니다.setprecision(2): 정밀도를 소수점 둘째 자리까지 설정합니다.
3. 세 번째 값: 과학적 표기법 출력
setprecision(9): 정밀도를 소수점 아홉째 자리까지 설정합니다.scientific: 값을 과학적 표기법으로 출력합니다.uppercase: 출력값을 모두 대문자로 표시합니다.noshowpos: 출력값 앞의 양수 부호를 생략합니다.
아래 구현 예제를 통해 더 자세히 살펴보겠습니다.
#include <iostream>
#include <iomanip>
using namespace std;
void solve(double a, double b, double c) {
cout << hex << showbase << nouppercase << left << (long long) a << endl;
cout << right << fixed << setw(15) << setfill('_') << setprecision(2) << showpos << b << endl;
cout << setprecision(9) << scientific << uppercase << noshowpos << c << endl;
}
int main() {
solve(256.367, 5783.489, 12.5643295643);
return 0;
}
입력
256.367, 5783.489, 12.5643295643
출력
0x100 _______+5783.49 1.256432956E+01