본문 바로가기

알고리즘

[백준] BOJ2608 - 로마 숫자 (JAVA)

https://www.acmicpc.net/problem/2608

 

2608번: 로마 숫자

첫째 줄과 둘째 줄에 하나씩 로마 숫자로 표현된 수가 주어진다. 입력된 각 수는 2000 보다 작거나 같고, 두 수의 합은 4000보다 작다.

www.acmicpc.net

import java.util.*;
import java.io.*;

public class Solution
{

    static HashMap<String, Integer> hash;

    static int getNum(String[] num){
        int sum = 0;

        for(int i=0;i<num.length;i++){
            char tmp = num[i].charAt(0);
            if((tmp=='I'||tmp=='X'||tmp=='C')&&i<num.length-1){
                String s = num[i]+num[i+1];
                if(hash.containsKey(s)){
                    sum+=hash.get(s);
                    i++;
                    continue;
                }
            }
            sum+=hash.get(num[i]);
        }
        return sum;
    }

    static String getRoma(int num){

        List<Map.Entry<String, Integer>> list = new ArrayList<>(hash.entrySet());
        list.sort(Map.Entry.comparingByValue(Collections.reverseOrder()));
        String ans = "";
        while(num>0){
            int tmp = 0;
            for(Map.Entry<String, Integer> entry : list){
                tmp = num / entry.getValue(); //내림차순 정렬해서 큰 수부터 하나씩 숫자 나눠보기
                for(int i=0;i<tmp;i++){
                    ans+=entry.getKey(); // 몫 만큼 반복해서 문자열 생성
                }
                num = num % entry.getValue(); // 나머지 갱신
            }
        }
        return ans;
    }

    public static void main(String args[]) throws Exception
    {

        hash = new HashMap<>();

        hash.put("I",1);
        hash.put("IV",4);
        hash.put("V",5);
        hash.put("IX",9);
        hash.put("X",10);
        hash.put("XL",40);
        hash.put("L",50);
        hash.put("XC",90);
        hash.put("C",100);
        hash.put("CD",400);
        hash.put("D",500);
        hash.put("CM",900);
        hash.put("M",1000);

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] a = br.readLine().split("");
        String[] b = br.readLine().split("");

        int sum = getNum(a) + getNum(b);
        String ans = getRoma(sum);
        System.out.println(sum);
        System.out.println(ans);

    }
}

주어진 기호를 hashMap 에 저장한다.

로마숫자를 아라비아 숫자로 바꾸는 getNum함수와 아라비아 숫자를 로마숫자로 바꾸는 getRoma함수를 구현했다.

<getNum함수>

조건에 따라 i번째 문자가 I또는 X또는 C이면서 마지막 글자가 아니면 그 다음 글자까지 붙여서 hashmap에 존재하는지 확인하고 존재한다면 sum에 더하고 i를 증가시키고 continue한다.

기본 조건은 sum에 hashmap에서 i번째 문자에 해당하는 value를 찾아 더하는 것이다.

<getRoma함수>

hashMap을 value 기준으로 내림차순 정렬을 시킨다. 그럼 큰 숫자 순으로 정렬이 될 것인데 이 때 hashmap의 value값을 하나씩 돌며 입력 값을 나눠 몫만큼 해당 key를 문자열에 더해준다.

입력값은 hashmap의 value로 나눈 나머지로 갱신해준다. 

입력값이 0이 될 때까지 반복한다.

 

hashMap을 key기준,  value 기준으로 정렬하는 방법을 꼭 기억하고 있어야겠다.