티스토리 뷰
완전 개 쌩 노가다 문제.. 다음부터 이런 문제는 거르는게 낫겠다
로마숫자를 아라비아숫자로 바꾸는것은 별로 어렵지 않다.
배열[로마숫자] = 아라비아숫자 -> 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;
}
'알고리즘' 카테고리의 다른 글
[c/c++] char배열과 문자열의 차이 (0) | 2017.08.27 |
---|---|
[c/c++] 문자열 입력 받기 (0) | 2017.08.27 |
백준 1057번 토너먼트(시뮬레이션) (0) | 2017.08.25 |
백준 2606번 바이러스 (bfs/플로이드-와샬 알고리즘) (1) | 2017.08.25 |
백준 2579번 계단 오르기 (2) | 2017.08.25 |
- Total
- Today
- Yesterday
- promise
- useRef
- Polyfill
- storybook
- es6
- computed
- type alias
- server side rendering
- typescript
- reflow
- hydrate
- async
- useEffect
- state
- mobx
- reactdom
- Babel
- react
- Next.js
- Action
- webpack
- reducer
- props
- react hooks
- rendering scope
- design system
- await
- atomic design
- return type
- javascript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |