반응형
https://www.acmicpc.net/problem/2608
2608번: 로마 숫자
첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.
www.acmicpc.net
[문제]
[풀이]
로마 숫자를 두 번 입력받아 그의 합을 아라비아 숫자와 로마 숫자로 출력하는 문제이다.
문제에서 설명하는 규칙은 4개이다.
- 보통 큰 숫자를 왼쪽에 작은 숫자를 오른쪽에 쓴다.
- V, L, D는 한 번만 사용할 수 있고 I, X, C, M은 연속해서 세 번까지 쓸 수 있다.
- 작은 숫자가 큰 숫자의 왼쪽에 오는 경우 : IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900이다. 이들 각각은 한 번씩만 사용이 가능하다.
- 모든 수는 가능한 가장 적은 개수의 로마 숫자들로 표현해야 한다.
로마 숫자를 입력받기 위해 string 변수를 선언해주고 a, b를 입력받는다.
map을 이용해서 각 로마 숫자별 아라비아 숫자 값을 저장해준다.
입력받은 a, b의 합을 저장할
sum 변수를 선언해주고 0으로 초기화 해준다.
a 값을 아라비아 숫자로 변환 후 sum에 저장하는 for문을 짜준다.
ex) MCM 이라는 로마 숫자가 있다면
0번째 M과 1번째 C를 비교해서 M이 C보다 아라비아 숫자 값이 크기 때문에 sum에 +해주고,
1번째 C와 2번째 M을 비교해서 C가 M보다 작기 때문에 규칙 3번을 적용. sum에서 -해주면 된다.
b값도 같은 방법으로 sum에 저장 해준다.
sum을 출력해주고
sum에서 1000부터 1까지 큰 값 순서대로 빼주면서 그에 맞는 로마 숫자를 deque에 저장해준다.
0이 되어 while문에서 빠져나오면 반복문으로 deque 배열을 출력해주면
아라비아 숫자와 로마 숫자를 출력할 수 있다.
[코드]
#include <iostream>
#include <string>
#include <deque>
#include <map>
using namespace std;
int main(){
string a, b;
map<char, int> key = {
{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50},
{'C', 100}, {'D', 500}, {'M', 1000}
};
deque<char> dq;
int sum = 0;
cin >> a >> b;
for(int i = 0; i < a.length(); i++){
if(key[a[i]] < key[a[i + 1]]){
sum-=key[a[i]];
}else{
sum+=key[a[i]];
}
}
for(int i = 0; i < b.length(); i++){
if(key[b[i]] < key[b[i + 1]]){
sum-=key[b[i]];
}else{
sum+=key[b[i]];
}
}
cout << sum << '\n';
while(sum != 0){
if(sum >= 1000){
dq.push_back('M');
sum-=1000;
}else if(sum >= 900){
dq.push_back('C');
dq.push_back('M');
sum-=900;
}else if(sum >= 500){
dq.push_back('D');
sum-=500;
}else if(sum >= 400){
dq.push_back('C');
dq.push_back('D');
sum-=400;
}else if(sum >= 100){
dq.push_back('C');
sum-=100;
}else if(sum >= 90){
dq.push_back('X');
dq.push_back('C');
sum-=90;
}else if(sum >= 50){
dq.push_back('L');
sum-=50;
}else if(sum >= 40){
dq.push_back('X');
dq.push_back('L');
sum-=40;
}else if(sum >= 10){
dq.push_back('X');
sum-=10;
}else if(sum >= 9){
dq.push_back('I');
dq.push_back('X');
sum-=9;
}else if(sum >= 5){
dq.push_back('V');
sum-=5;
}else if(sum >= 4){
dq.push_back('I');
dq.push_back('V');
sum-=4;
}else{
dq.push_back('I');
sum-=1;
}
}
for(int i = 0; i < dq.size(); i++){
cout << dq[i];
}
}
반응형