[C++] ALGOSPOT : CONVERT


이미지 22

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();
    }
}