https://leetcode.com/problems/integer-to-roman/description/

코드설명

TreeMap(트리맵) + 구현(Implementation) 문제입니다.

 

문제에서 중요한점은, 숫자를 Roman 식으로 바꿔야하기 위해 미리 각 숫자를 연산해서 TreeMap에 넣는것 입니다.

표에 나와있는 언어들 외에 처리해야할 부분이 포인트입니다.

예시로, 900, 400, 90, 40, 9, 4 가 문제설명 테이블에 없는 Roman 단어입니다.

해당 사항들을 TreeMap에 넣고 Roman 으로 바꾸면 됩니다.

 

문제에서 헷갈리는 부분은 3번쟤 조건입니다. 

  • Only powers of 10 (I, X, C, M) can be appended consecutively at most 3 times to represent multiples of 10. You cannot append 5 (V), 50 (L), or 500 (D) multiple times. If you need to append a symbol 4 times use the subtractive form.

처음에, 이 부분에서 저의 경우 VLD도 3번 연속적으로 붙으면 안된다고 이해했습니다.

그렇기에 555가 들어오면 어떻게 처리되어야하지? 555면 DLV여야 하는데 이것이 불가능하다면 예외처리를 모두 해야하는건가? 라는 생각이 들었습니다.

하지만, 각 VLD가 연속으로 붙는 것이 아닌, 각 단어들이 각각 2개연속이 안된다는 의미입니다. 즉, [VV]*, [LL]*, [DD]* 가 정규표현식 패턴에 매칭되면 안되는 것이죠.

처음에는 특정 문자열을 만든뒤 정규표현식으로 "D"가 2번이상 사용될경우 매칭되어 실패하도록 하게 할 수 있습니다.

V나 L도 같습니다.

혹은 D가 반드시 1개만 나오도록 정규표현식을 .*[D]{1,}.* 로 짜도됩니다. 

String regEx=".*[D]{1,}.*"
String regEx = ".*[D]{2,}.*";

String roman = "ABCDDD";
if(roman.matches(regEx) == true){
	return false;
}

 

 

그리고 number의 범위가

  • 1 <= num <= 3999

이기에 그렇게 큰 숫자가 나오지는 않음을 알 수 있습니다.

코드

class Solution {
    TreeMap<Integer, String> romanMap = new TreeMap<>(new Comparator<Integer>(){
        @Override
        public int compare(Integer a, Integer b){
            return -Integer.compare(a, b);
        }
    });

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

        StringBuilder result = new StringBuilder();
        
        for(Map.Entry<Integer, String> entry : romanMap.entrySet()){
            while(num >= entry.getKey()){
                result.append(entry.getValue());
                num -= entry.getKey();
            }
        }

        return result.toString();
    }
}

+ Recent posts