
INPUT에서 값과 단위를 읽고
단위에 따라 변환 Multiplier을 곱하여 단위를 변환한다.
이 문제를 풀면서 새로 배웠던 부분은 iomanip의 setprecision(i)
0을 0.000 이런식으로 숫자에 포맷을 주고 싶을때 사용한다.
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
enum Unit{
NONE = -1,
KILOGRAM,
POUND,
LITER,
GALLON
};
class Data{
public:
static const string UNITSTR[];
static const double MULTIPLIER[];
double value;
Unit unit;
Data(void);
void setData(Unit u, double v);
Data convert();
void print();
};
const string Data::UNITSTR[] = {"kg","lb", "l", "g"};
const double Data::MULTIPLIER[] = {2.2046, 0.4536, 0.2642, 3.7854};
Data::Data(){
unit = NONE;
value = 0;
}
void Data::setData(Unit u, double v){
unit = u;
value = v;
}
Data Data::convert(){
double v = value * MULTIPLIER[unit];
int u;
if(unit%2==0){
u = unit + 1;
}else{
u = unit - 1;
}
Data d;
d.setData((Unit) u, v);
return d;
}
void Data::print(){
cout << fixed << setprecision(4) << value << " " << UNITSTR[unit] << endl;
}
int main(){
int t;
cin >> t;
cin.ignore();
vector<Data> v;
for(int i=0; i<t; i++){
string input, value, unit;
int pos;
double d;
Unit u;
getline(cin, input);
pos = input.find(" ");
value = input.substr(0, pos);
unit = input.substr(pos+1, input.length()-pos);
d = stod(value);
for(int j=0; j<4; j++){
if(unit==Data::UNITSTR[j]){
u = (Unit) (j);
break;
}
}
Data data;
data.setData(u, d);
data=data.convert();
v.push_back(data);
}
for(int i=0; i<t; i++){
cout << i+1 << " ";
v[i].print();
}
}