티스토리 뷰


완전 개 쌩 노가다 문제.. 다음부터 이런 문제는 거르는게 낫겠다


로마숫자를 아라비아숫자로 바꾸는것은 별로 어렵지 않다.


배열[로마숫자] = 아라비아숫자 -> arr['V'] = 5;  이런식으로 배열에 넣어놓고 나서 주어진 입력의 로마숫자에 대해서


하나씩 문자를 택한뒤 그 로마숫자를 아라비아숫자로 변환만 해줘서 더해주기만 하면 된다.


int romtonum(string temp)

{

    int ret=roma[temp[0]];

    for(int i=1; i<temp.size(); i++)

    {

        if(roma[temp[i-1]]<roma[temp[i]]) ret += roma[temp[i]]-roma[temp[i-1]]*2;

        else ret += roma[temp[i]];

    }

    return ret;

}

그게 이부분이다.


*2를 빼준 이유는 앞에 숫자가 한번더 더해졌기 때문이다. MCMXL에서 앞에서 부터 차례대로 반복문 안으로 들어오게 되는데


MCM중 3번째에 있는 M에서 반복문이 진행중이라고 가정했을때

바로 전 반복에서 C에 해당하는 숫자가(100) ret 에 더해졌고 M의 반복문에서는 CM에 해당하는 숫자가 더해질거기 때문에 

800이 더해지는게 맞다. 그래서 바로전 숫자 *2를 빼준것이다.


-->말로 설명하기 좀 애매한 부분이 있는데 곰곰히 생각해보길 바란다.




그다음은 숫자가 들어오면 로마숫자로 바꿔주는 함수이다. 문제 조건에 주어진 것을 스윗치문으로 한번 걸러주고 남은 숫자들에 대해서 한번더 처리를 해주었다.


string numtorom(int num) //숫자를 로마숫자로 바꿔주는 함수

{

    string temp;

    switch(num)

    {

        case 0: return "";

        case 1: return "I";

        case 5: return "V";

        case 10: return "X";

        case 50: return "L";

        case 100: return "C";

        case 500: return "D";

        case 1000: return "M";

        case 4: return "IV";

        case 9: return "IX";

        case 40: return "XL";

        case 90: return "XC";

        case 400: return "CD";

        case 900: return "CM";

        default:

            if(num/10 == 0) //num 한자리수 경우

            {

                if(num>5){ num -=5; temp += numtorom(5);}

                if(num%3==1)temp+= "I";

                if(num%3==2)temp+= "II";

                if(num%3==0)temp+= "III";

            }else if(num/100 == 0) //num 두자리수 경우

            {

                if(num>50){ num -=50; temp += numtorom(50);}

                if((num/10)%3==1)temp+= "X";

                if((num/10)%3==2)temp+= "XX";

                if((num/10)%3==0)temp+= "XXX";

            }

            else if(num/1000 == 0) //num 세자리수 경우

            {

                if(num>500){ num -=500; temp += numtorom(500);}

                if((num/100)%3==1){temp+= "C";}

                if((num/100)%3==2)temp+= "CC";

                if((num/100)%3==0)temp+= "CCC";

            }else if(num/10000 == 0) //num 네자리수 경우

            {

                for(int i=1; i<=(num/1000); i++)

                    temp+="M";

            }

            

    }

    return temp;

}


주석을 참고하면 이해가 갈거라고 생각된다.


정답률은 49%였지만 정말 이런 노가다 문제는 알고리즘 실력 향상에 도움이 될지 의문이다.. 


그래도 내 스스로 모든 로마숫자를 구하는 프로그램을 만들었다고 생각하니까 한편으론 괜찮기도 하다..



전체코드


#include <iostream>

#include <algorithm>

#include <string>

using namespace std;

int n;

int roma[129];

string roma2[1001];


int romtonum(string temp)

{

    int ret=roma[temp[0]];

    for(int i=1; i<temp.size(); i++)

    {

        if(roma[temp[i-1]]<roma[temp[i]]) ret += roma[temp[i]]-roma[temp[i-1]]*2;

        else ret += roma[temp[i]];

    }

    return ret;

}

string numtorom(int num) //숫자를 로마숫자로 바꿔주는 함수

{

    string temp;

    switch(num)

    {

        case 0: return "";

        case 1: return "I";

        case 5: return "V";

        case 10: return "X";

        case 50: return "L";

        case 100: return "C";

        case 500: return "D";

        case 1000: return "M";

        case 4: return "IV";

        case 9: return "IX";

        case 40: return "XL";

        case 90: return "XC";

        case 400: return "CD";

        case 900: return "CM";

        default:

            if(num/10 == 0) //num 한자리수 경우

            {

                if(num>5){ num -=5; temp += numtorom(5);}

                if(num%3==1)temp+= "I";

                if(num%3==2)temp+= "II";

                if(num%3==0)temp+= "III";

            }else if(num/100 == 0) //num 두자리수 경우

            {

                if(num>50){ num -=50; temp += numtorom(50);}

                if((num/10)%3==1)temp+= "X";

                if((num/10)%3==2)temp+= "XX";

                if((num/10)%3==0)temp+= "XXX";

            }

            else if(num/1000 == 0) //num 세자리수 경우

            {

                if(num>500){ num -=500; temp += numtorom(500);}

                if((num/100)%3==1){temp+= "C";}

                if((num/100)%3==2)temp+= "CC";

                if((num/100)%3==0)temp+= "CCC";

            }else if(num/10000 == 0) //num 네자리수 경우

            {

                for(int i=1; i<=(num/1000); i++)

                    temp+="M";

            }

            

    }

    return temp;

}


int main()

{

    roma['I'] =1;

    roma['V'] =5;

    roma['X'] =10;

    roma['L'] =50;

    roma['C'] =100;

    roma['D'] =500;

    roma['M'] =1000;

    string str1,str2;

    cin>>str1>>str2;

    int num=romtonum(str1) + romtonum(str2);

    cout<<num<<endl;

    string result;

    int ten=10;

    while(num != 0)

    {

        result.insert(0, numtorom(num%ten));

        num -= num%ten;

        ten *=10;

    }

    cout<<result<<endl;

    return 0;

}

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함