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

 

symbol 별로 숫자값이 할당 돼 있다.

처음 구상은 주어진 문자열 s를 char로 바꿔 하나씩 symbol을 확인해 가며 숫자로 변경하고 더하는 방식이었다.

하지만 문제에는 예외가 있었다. 큰 숫자에서 작은 숫자 순서로 나오는 로마 숫자이지만 작은 숫자 다음 큰 숫자가 나오면 뺄셈이 적용된다는 것이다.

예를 들어 문자열 s = “MCMXCIV”일 떄를 보자.

이는 [’M’, ‘C’, ‘M’, ‘X’, ‘C’, ‘I’, ‘V’] 로 바뀐다. 이를 숫자로 바꾸면 [1000, 100, 1000, 10, 100, 1, 5]가 된다.

이제 합을 누적 해 가야 한다. 단 다음 수보다 작은 수의 경우는 뺄 샘을 해준다.

1000 - 100 +1000 - 10 + 100 - 1 + 5 = 1994 가된다.

class Solution {

    static Map<Character, Integer> symbolMap = new HashMap<>();

    public int romanToInt(String s) {
        int n = s.length();
        if (n == 0) {
            return 0;
        }
        int answer = 0;
        init();

        for (int i = 0; i < n - 1; i++) {
            int symbolValue = symbolMap.get(s.charAt(i));
            int nextSymbolValue = symbolMap.get(s.charAt(i + 1));

            if (symbolValue < nextSymbolValue) {
                answer -= symbolValue;
            } else {
                answer += symbolValue;
            }

        }
        return answer + symbolMap.get(s.charAt(n - 1));
    }

    private void init() {
        symbolMap.put('I', 1);
        symbolMap.put('V', 5);
        symbolMap.put('X', 10);
        symbolMap.put('L', 50);
        symbolMap.put('C', 100);
        symbolMap.put('D', 500);
        symbolMap.put('M', 1000);
    }
}

'Algorithm > LeetCode' 카테고리의 다른 글

LeetCode 151 - Reverse Words in a String  (1) 2024.10.03
LeetCode 12 - Integer to Roman  (0) 2024.10.03
LeetCode 42 - Trapping Rain Water  (0) 2024.10.02
LeetCode 150 - Candy  (1) 2024.09.30
LeetCode 134 - Gas Station  (1) 2024.09.29

+ Recent posts