Algorithm

[LeetCode] 12. Integer to Roman

SeangG 2024. 4. 2. 11:39

문제


Given an integer, convert it to a roman numeral.

1 <= num <= 3999

 

숫자가 주어지면 로마 숫자로 변환하는 문제이다.

예를 들면, 1994가 주어졌을 때 MCMXCIV를 반환하면 된다.


 

풀이


아이디어

각 자릿수에 대한 경우의 수가 많지 않다. (4 * 10 * 10 * 10; 0을 포함)

따라서 미리 정의한 후에 변환한다.

 

코드

class Solution:
    def intToRoman(self, num: int) -> str:
        # 경우의 수가 많지 않기 때문에 각 자릿수에 대한 로마자 표기를 미리 정의
        thousands = ['M'*i for i in range(4)]
        hundreds = ['C'*i for i in range(4)] + ["CD"] + ["D"+"C"*i for i in range(4)] + ["CM"]
        tens = ['X'*i for i in range(4)] + ["XL"] + ["L"+"X"*i for i in range(4)] + ["XC"]
        ones = ['I'*i for i in range(4)] + ["IV"] + ["V"+"I"*i for i in range(4)] + ["IX"]

        # 앞에 0을 채워서 코드 단순화
        # ex) 1 -> 0001, 23 -> 0023
        num_s = str(num).zfill(4)
        return thousands[int(num_s[0])] + hundreds[int(num_s[1])] + tens[int(num_s[2])] + ones[int(num_s[3])]

 

후기


난이도

경우의 수가 많지 않다는 것을 파악하면 쉽게 구현할 수 있다.

 

로마 숫자의 범위가 거의 안 쓰는 F(5000)를 포함하더라도 원래 작지만,

만약 더 큰 수를 나타내는 표기가 많아져 주어지는 수의 범위가 커지더라도,

규칙성을 이용해 쉽게 풀 수 있을 것이다.

 

다른 풀이

경우의 수를 미리 정의하지 않고 if문을 통해 처리하면 시간과 메모리를 아낄 수 있지 않을까 싶다.

단, 숫자가 여러 번 주어진다면 경우의 수를 미리 정의하는 것이 빠르다.