Algorithm/LeetCode

12. Integer to Roman

문제 파악 및 재정의

 

I             1
V             5
X             10
L             50
C             100
D             500
M             1000
로마 숫자를 정수로 변환시켜라

예를 들어, 2는 로마 숫자에서 II로 표기되며, 단지 두 개의 1을 더한 것입니다. 12는 XII로 표기되며, 간단히 X + II입니다. 숫자 27은 XXVII로 표기되며, 이는 XX + V + II입니다.

로마 숫자는 일반적으로 왼쪽에서 오른쪽으로 큰 순서로 씁니다. 그러나 4의 숫자는 IIII가 아닙니다. 대신 숫자 4는 IV로 씁니다. 1이 5보다 앞에 있기 때문에 빼면 4가 됩니다. 같은 원리가 IX로 쓰여진 숫자 9에도 적용됩니다. 빼기가 사용되는 경우는 6가지입니다.

V(5)와 X(10) 앞에 I를 배치하여 4와 9를 만들 수 있습니다.
X는 L(50)과 C(100) 앞에 배치하여 40과 90을 만들 수 있습니다.
C는 D(500)와 M(1000) 앞에 배치되어 400과 900을 만들 수 있습니다.
정수가 주어지면 로마 숫자로 변환하십시오.

자료구조 및 알고리즘 선택


입력된 정수를 1000 / 500 / 100 / 50 / 10 / 5 / 1 단위로 분할 X
13개의 값을 미리 mapping
1000 (M) 
900 (CM) 
500 (D) 
400 (CD)
100 (C)
90 (XC)
50 (L)
40 (XL)
10 (X)
9 (IX)
5 (V)
4 (IV)
1 (I)

구현

import java.util.*;

class Solution {
    public String intToRoman(int num) {
        
        StringBuilder sb = new StringBuilder();
        int idx = 13;
        int[] intArr = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] romanArr = new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        while(num != 0) {
            if(num >= intArr[intArr.length - idx]) {
                num -= intArr[intArr.length - idx];
                sb.append(romanArr[intArr.length - idx]);
            } else {
                idx--;
            }
        }
        return sb.toString();
    }
}

 

회고

어찌됐건 미리 해당 값을 설정해두고 반환해야 했다.

어떤 수학적인 식으로 생성할 수 있을까 했는데 잔꾀부리다가 시간이 오래걸렸다.

Runtime : 4ms | Memory Usage : 42.1MB

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

1929. Concatenation of Array  (0) 2023.03.30
2319. Check if Matrix Is X-Matrix  (0) 2023.03.07
278. First Bad Version  (0) 2023.03.03
35. Search Insert Position  (0) 2023.02.28
242. Valid Anagram  (0) 2023.02.26