Algorithm/LeetCode

[LeetCode] Roman to Integer

문제 : 로마 문자의 문자열을 숫자로 변환하기

 

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

Example 1:

Input: s = "III" Output: 3

Example 2:

Input: s = "IV" Output: 4

Example 3:

Input: s = "IX" Output: 9

Example 4:

Input: s = "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3.

Example 5:

Input: s = "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

조건

1 <= s.length <= 15

s는 ('I', 'V', 'X', 'L', 'C', 'D', 'M')의 문자만 포함

변환한 숫자의 합은 1 ~ 3999의 범위를 보장함.


문제 접근

문자열을 문자 배열로

문자 배열을 숫자로 치환

class Solution {
    public int romanToInt(String s) {
        int sumValue = 0;
        int[] numberArr = new int[s.length()];
        char[] romancharArr = s.toCharArray();
         
        for(int i = 0; i < romancharArr.length; i++) {
            switch(romancharArr[i]) {
                case 'M':
                    numberArr[i] = 1000;
                    break;
                case 'D':
                    numberArr[i] = 500;
                    break;
                case 'C':
                    numberArr[i] = 100;
                    break;
                case 'L':
                    numberArr[i] = 50;
                    break;
                case 'X':
                    numberArr[i] = 10;
                    break;
                case 'V':
                    numberArr[i] = 5;
                    break;
                case 'I':
                    numberArr[i] = 1;
                    break;
            }
        }
        
        for(int num : numberArr)
        {
            sumValue += num;
        }
        return sumValue;
    }
}

-> IV = 6이 아닌 4같은 예외 케이스를 처리할 수 없음.

그렇다면? 규칙성이 있을 것이다.

IV = 6이 아닌 4, CM -> 1100이 아닌 900, XC -> 110이 아닌 90

-> V - I, M - C, C - X 같은 엮인 두 수를 큰수 - 작은수로 만들어야 한다.

MCMXCIV -> MMCCXVI가 원래 맞는 순서? ->

가장 큰 숫자 부터 돌면서 임시 변수에 넣어두고 그 다음수와 대조하여 그 보다 작은 수 일 경우

그 수를 빼면 되지 않을까

class Solution {
    public int romanToInt(String s) {
        int sumValue = 0;
        int beforeValue = 0;
        int[] numberArr = new int[s.length()];
        char[] romancharArr = s.toCharArray();
         
        for(int i = 0; i < romancharArr.length; i++) {
            switch(romancharArr[i]) {
                case 'M':
                    numberArr[i] = 1000;
                    break;
                case 'D':
                    numberArr[i] = 500;
                    break;
                case 'C':
                    numberArr[i] = 100;
                    break;
                case 'L':
                    numberArr[i] = 50;
                    break;
                case 'X':
                    numberArr[i] = 10;
                    break;
                case 'V':
                    numberArr[i] = 5;
                    break;
                case 'I':
                    numberArr[i] = 1;
                    break;
            }
        }
        
        for(int i = numberArr.length-1; i >= 0; i--) {
            if(numberArr[i] < beforeValue) {
                sumValue -= numberArr[i];
            }
            else {
                sumValue += numberArr[i];
                beforeValue = numberArr[i];
            }
        }
         
        return sumValue;
    }
}

Runtime: 3 ms, faster than 99.91% of Java online submissions for Roman to Integer.
Memory Usage: 38.8 MB, less than 93.85% of Java online submissions for Roman to Integer.

 

배고프다...

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

[LeetCode] Two Sum  (0) 2021.03.16
[LeetCode] Top K Frequent Elements  (0) 2021.03.15
[LeetCode] Path Sum Debuging  (0) 2021.03.11
[LeetCode] Path Sum  (0) 2021.03.11
[LeetCode] Binary Tree Inorder TraversalSolution  (0) 2021.03.10