import java.io.*;
import java.util.*;
/**
* BOJ 2608 로마 숫자 풀이
* https://gist.github.com/KSH-code/c90a9fe61c3d8f0a2d517bafbbd68d15
*/
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str1 = br.readLine();
String str2 = br.readLine();
int sum = StringToNumber(str1) + StringToNumber(str2);
System.out.println(sum);
System.out.println(NumberToString("", sum));
}
private static String NumberToString(String s,int num){
while(num >= 1000){
s += "M";
num -= 1000;
}
if(num >= 900){
s+= "CM";
num -= 900;
}
if(num >= 500){
s+= "D";
num -= 500;
}
if(num >= 400){
s+= "CD";
num -= 400;
}
while(num >= 100){
s += "C";
num -= 100;
}
if(num >= 90){
s+= "XC";
num -= 90;
}
if(num >= 50){
s+= "L";
num -= 50;
}
if(num >= 40){
s+= "XL";
num -= 40;
}
while(num >= 10){
s += "X";
num -= 10;
}
if(num >= 9){
s+= "IX";
num -= 9;
}
if(num >= 5){
s+= "V";
num -= 5;
}
if(num >= 4){
s+= "IV";
num -= 4;
}
while(num >= 1){
s += "I";
num -= 1;
}
return s;
}
private static int StringToNumber(String str){
int sum = 0;
for(int i = 0; i<str.length(); i++){
char C = str.charAt(i);
if(i+1<str.length()){
String temp = String.valueOf(C) + String.valueOf(str.charAt(i+1));
switch(temp){
case "CM":
sum+= 900;
break;
case "CD":
sum+= 400;
break;
case "XC":
sum+= 90;
break;
case "XL":
sum+= 40;
break;
case "IX":
sum+= 9;
break;
case "IV":
sum+= 4;
break;
default:
sum += charToNumber(C);
i--;
break;
}
i++;
}else
sum += charToNumber(C);
}
return sum;
}
private static int charToNumber(char C){
switch(C){
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return 0;
}
}
}
view raw Main.java hosted with ❤ by GitHub


문제

로마 시대 때는 현재 사용하는 아라비아 숫자가 아닌 다른 방법으로 수를 표현하였다.

로마 숫자는 다음과 같은 7개의 기호로 이루어진다.

기호IVXLCDM
1510501005001000

수를 만드는 규칙은 다음과 같다.

  1. 보통 큰 숫자를 왼쪽에 작은 숫자를 오른쪽에 쓴다. 그리고 그 값은 모든 숫자의 값을 더한 값이 된다. 예를 들어 LX = 50 + 10 = 60 이 되고, MLI = 1000 + 50 + 1 = 1051 이 된다.
  2. V, L, D는 한 번만 사용할 수 있고 I, X, C, M은 연속해서 세 번까지만 사용할 수 있다. 예를 들어 VV나 LXIIII 와 같은 수는 없다. 그리고 같은 숫자가 반복되면 그 값은 모든 숫자의 값을 더한 값이 된다. 예를 들어 XXX = 10 + 10 + 10 = 30 이 되고, CCLIII = 100 + 100 + 50 + 1 + 1 + 1 = 253 이 된다.
  3. 작은 숫자가 큰 숫자의 왼쪽에 오는 경우는 다음과 같다. IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900 을 나타낸다. 이들 각각은 한 번씩만 사용할 수 있다. 그런데 IV 와 IX 는 같이 쓸 수 없으며 XL 과 XC, CD 와 CM 또한 같이 쓸 수 없다. 이들 외에는 작은 숫자가 큰 숫자 왼쪽 어디에도 나올 수 없다. 예를 들어 XCXC 나 CMCD, VX 나 IIX 와 같은 수는 없다. 참고로 LIX = 50 + 9 = 59, CXC = 100 + 90 = 190 이 된다.
  4. 모든 수는 가능한 가장 적은 개수의 로마 숫자들로 표현해야 한다. 예를 들어 60 은 LX 이지 XLXX 가 아니고, 5 는 V 이지 IVI 가 아니다.

아래의 예를 참고 하시오.

  • DLIII = 500 + 50 + 3 = 553
  • MCMXL = 1000 + 900 + 40 = 1940
  • 235 = CCXXXV
  • 2493 = MMCDXCIII

로마 숫자로 이루어진 두 수를 입력받아 그 둘을 더한 값을 아라비아 숫자와 로마 숫자로 출력하는 프로그램을 작성하시오.

입력

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작다.

출력

입력으로 주어진 두 수를 더한 값을 첫째 줄에 아라비아숫자로 출력하고 둘째 줄에는 로마 숫자로 출력한다.


+ Recent posts