기타

LeetCode with Python / 12. Integer to Roman

Limm_jk 2020. 10. 20. 02:47

12. Integer to Roman

제시된 정수를 로마자로 변경하여서 출력하는 알고리즘이다.

문제조건

로마자는 많은 이들이 알듯, 표기방식이 굉장히 독특하다.

1 -> I / 2-> II / 3 -> III / 4 -> IV

위와 같이 1,2,3은 똑같이 진행되다가, 4에서는 상위 레벨의 문자에서 이전 레벨의 문자를 앞에 표기하는 식으로 진행된다. 

Symbol의 레벨은 각 자릿수의 5의 배수에서 변경 됨을 알 수 있다.

조건을 해석해서 결과를 예측해보면 위와 같은 예시를 볼 수 있다.

 

또한 입력값의 범위가 1에서 3999까지로 한정되어있다. 마지막 자리를 비교적 신경을 덜 써도 됨을 알 수 있다.

 

문제풀이

먼저 연산의 편의를 위하여 어떤 수가 들어오던 4자리의 수로 맞춰주어야 하겠다는 생각을 먼저 했다.

그래서 입력된 정수를 List로 변경하고, 이 List의 length가 4보다 작을 경우 4가 될때까지 앞에 0을 삽입해준다. 

ex) 3 -> [0,0,0,3]

 

다음으로는 각 자리를 로마자로 변경하는 작업을 해야하는데, 이 과정에서 각 자리의 변경작업이 동일하게 이루어지므로, 함수를 지정해서 사용하면 좋겠다는 생각을 하였다.

 

그래서 그 자리의 값(num), 1의자리 로마자(one), 5의자리 로마자(five), 10의 자리 로마자(ten)를 인자로 받는roman함수를 생성해준다.

그 후, 이 연산에서 특이한 값은 4의 연산, 4와 9가 특이하게 연산된다. 이런 case는 따로 Exeption으로 지정하여 초기에 연산하여 준다. 

위의 case가 아닌 경우는 공통적으로 연산된다. 먼저 num이 5보다 작은지 확인한다. 5보다 같거나 클 경우, five를 처음에 붙여준다. 다음으로 one을 필요값만큼 붙여주는데, 이 필요값은 num을 5로 나눈 나머지를 의미한다.

 

이러한 연산을 각 자리 진행해주고, python에서 str은 +연산을 지원하므로, 간단하게 정리했다.

 

소스코드

class Solution:
    def roman(self, num:int, one:str, five:str, ten:str) -> str:
        if num==9: return one+ten
        if num==4: return one+five
        
        ret = ''
        if num>=5:ret+=five
        for _ in range(num%5):
            ret+=one
        return ret
    
    def intToRoman(self, num: int) -> str:
        num_list = list(str(num))
        num_list = list(map(lambda x : int(x),num_list))
        if len(num_list) != 4:
            for _ in range(4-len(num_list)):
                num_list.insert(0,0)
        
        answer = self.roman(num_list[0], 'M', 'A', 'A') + self.roman(num_list[1], 'C', 'D', 'M') +
        	self.roman(num_list[2], 'X', 'L', 'C') + self.roman(num_list[3], 'I', 'V', 'X')
        return answer

answer의 첫번째 roman, five와 ten의 값은 dummy data를 넣어주었습니다.