로마+숫자

= 로마 숫자 = 로마 시대 때는 현재 사용하는 아라비아 숫자가 아닌 다른 방법으로 수를 표현하였다. 로마 숫자는 다음과 같은 7개의 기호로 이루어진다. 수를 만드는 규칙은 다음과 같다.
 * ~ 기호 || I || V || X || L || C || D || M ||
 * ~ 값 || 1 || 5 || 10 || 50 || 100 || 500 || 1000 ||

규칙 1. 보통 큰 숫자를 왼쪽에, 작은 숫자를 오른쪽에 쓴다. 그리고 값은 모든 숫자의 값을 더한 값이 된다. 예를 들어 LX = 50 + 10 = 60 이 되고, MLI = 1000 + 50 + 1 = 1051 이 된다.

규칙 2. V, I, 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

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

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

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

Sample Input
DLIII MCMXL

Sample Output
2493 MMCDXCIII

Source Code code format="java5" import java.util.Scanner;

class Converter { // 변환 테이블 private static char[] signs = {'I', 'V', 'X', 'L', 'C', 'D', 'M'}; private static int[] values = {1, 5, 10, 50, 100, 500, 1000}; /** public static int romaToArabia(String roma) { int pre = 0; int sum = 0; for(char ch : roma.toCharArray) { int v = getValue(ch); if(pre != 0) { if(pre < v) { sum -= pre * 2; } } sum += v; pre = v; } return sum; } /** public static String arabiaToRoma(int arabia) { String input = Integer.toString(arabia); StringBuilder sb = new StringBuilder; for(int i = 0; i < input.length; i++){ int d = input.length - i - 1; char ch = input.charAt(i); switch(ch){ case '1': sb.append(signs[d * 2]); break; case '2': sb.append(signs[d * 2]); sb.append(signs[d * 2]); break; case '3': sb.append(signs[d * 2]); sb.append(signs[d * 2]); sb.append(signs[d * 2]); break; case '4': sb.append(signs[d * 2]); sb.append(signs[d * 2 + 1]); break; case '5': sb.append(signs[d * 2 + 1]); break; case '6': sb.append(signs[d * 2 + 1]); sb.append(signs[d * 2]); break; case '7': sb.append(signs[d * 2 + 1]); sb.append(signs[d * 2]); sb.append(signs[d * 2]); case '8': sb.append(signs[d * 2 + 1]); sb.append(signs[d * 2]); sb.append(signs[d * 2]); sb.append(signs[d * 2]); case '9': sb.append(signs[d * 2]); sb.append(signs[d * 2 + 2]); break; default: break; } } return sb.toString; } /** private static int getValue(char sign) { for(int i = 0; i < signs.length; i++) { if(signs[i] == sign) { return values[i]; } } return 0; } }
 * 로마 숫자를 아라비아 숫자로 변환한다.
 * @param roma 로마 숫자 ex) DLIII
 * @return 아라비아 숫자 ex) 553
 * 아라비아 숫자를 로마 숫자로 변환한다.
 * @param arabia 아라비아 숫자
 * @return 로마 숫자
 * 로마 기호로 아라비아 값을 찾는다.
 * @param sign 로마 기호
 * @return 아라비아 값

public class RomaNum{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); // 로마 숫자로 표현된 수 String inputRoma1 = scan.next; String inputRoma2 = scan.next; int arabia1 = Converter.romaToArabia(inputRoma1); int arabia2 = Converter.romaToArabia(inputRoma2); int sumArabia = arabia1 + arabia2; String sumRoma = Converter.arabiaToRoma(sumArabia); System.out.println(sumArabia); System.out.println(sumRoma); } } code

Comment