본문 바로가기

백준 문제풀기/JAVA

[백준 2608 JAVA 자바] 로마 숫자

 

오랜만에 골드 문제입니다

 

사실 로마숫자를 읽는 방법은

상식으로 다들 알고 계실겁니다

 

그걸 이제 프로그레밍으로 구현하는게

 

이번 문제입니다

 

코드입니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Main {
    static final HashMap<Character, Integer> roman = new HashMap<>();
    
    static {
        roman.put('I', 1);
        roman.put('V', 5);
        roman.put('X', 10);
        roman.put('L', 50);
        roman.put('C', 100);
        roman.put('D', 500);
        roman.put('M', 1000);
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     
        String str1 = br.readLine();
        int num1 = romantonum(str1);
     
        String str2 = br.readLine();
        int num2 = romantonum(str2);
     
        int sum = num1 + num2;
     
        String arabia = convertNumToStr(sum);
     
        System.out.println(sum);
        System.out.println(arabia);
    }
    
    public static int romantonum(String str) {
        int result = 0;
     
        int length = str.length();
        int index = 0;
     
        while (index < length) {
            char now = str.charAt(index);
     
            index += 1;
            if (index < length) {
                char next = str.charAt(index);
     
                if (roman.get(now) < roman.get(next)) {
                    result += (roman.get(next) - roman.get(now));
                    index += 1;
                    continue;
                }
            }
            result += roman.get(now);
        }
        return result;
    }
    
    public static String convertNumToStr(int num) {
        StringBuilder sb = new StringBuilder();
        String numStr = Integer.toString(num);
     
        int length = numStr.length();
     
        for (int i = 0; i < length; i++) {
            int now = numStr.charAt(i) - '0';
            if (now == 0) continue;
    
            int nowLength = (length - i);
     
            if (nowLength == 4) {
                for (int j = 0; j < now; j++) {
                    sb.append("M");
                }
     
                continue;
            }
            
            String one = "";
            String five = "";
            String ten = "";
     
            switch (nowLength) {
                case 3:
                    one = "C";
                    five = "D";
                    ten = "M";
                    break;
                case 2:
                    one = "X";
                    five = "L";
                    ten = "C";
                    break;
                case 1:
                    one = "I";
                    five = "V";
                    ten = "X";
                    break;
            }
            switch (now) {
                case 1:
                case 2:
                case 3:
                    for (int j = 0; j < now; j++) {
                        sb.append(one);
                    }
                    break;
                case 4:
                    sb.append(one).append(five);
                    break;
                case 5:
                    sb.append(five);
                    break;
                case 6:
                case 7:
                case 8:
                    sb.append(five);
                    for (int j = 0; j < now - 5; j++) {
                        sb.append(one);
                    }
                    break;
                case 9:
                    sb.append(one).append(ten);
                    break;
            }
     
        }
        return sb.toString();
    }
}

 

로마 숫자 -> 아라비아 숫자

아라비아 숫자 -> 로마 숫자

 

두개 다 해야되기에

코드가 좀 복잡합니다

 

좀더 실력을 기른 다음에 다시 풀어봐야겠네요