12. Integer to Roman

Yongsang Yoon·2022년 1월 24일
0

LeetCode

목록 보기
3/9

Problem

숫자를 로마숫자로 바꾸는 문제

각 자릿수별로 숫자를 나누는게 좀 애매해서 그냥 str으로 변경 후 index로 읽었다..

Trials

Code 1

class Solution:
    def intToRoman(self, num: int) -> str:       
        
        tmp = str(num)
        n = len(tmp)
        answer =''
        for i in range(n):
            l = pow(10,n-1-i)
            digit = int(tmp[i])
            
            if l == 1000:
                answer += 'M'*digit
            
            elif l == 100:
                if digit == 9:
                    answer = answer + 'CM'
                elif 5<digit<9:
                    answer = answer +'D'+'C'*(digit-5)
                elif digit ==4:
                    answer = answer +'CD'
                else:
                    answer = answer +'C'*(digit-5)
                    

            elif l == 10:
                if digit == 9:
                    answer = answer + 'XC'
                elif 5<digit<9:
                    answer = answer +'L'+'X'*(digit-5)
                elif digit ==4:
                    answer = answer +'XL'
                else:
                    answer = answer +'X'*(digit-5)
            
            
            else:
                if digit == 9:
                    answer = answer + 'IX'
                elif 5<digit<9:
                    answer = answer +'V'+'I'*(digit-5)
                elif digit ==4:
                    answer = answer +'IV'
                else:
                    answer = answer +'I'*(digit-5)
                    
        return answer

your input: 3
output: ""
expetected: "III"

  1. digit ==5 상태가 누락됨.
  2. digit이 5미만 일때도 (digit-5) 수행함

Conclusion

class Solution:
    def intToRoman(self, num: int) -> str:       
        
        tmp = str(num)
        n = len(tmp)
        answer =''
        for i in range(n):
            l = pow(10,n-1-i)
            digit = int(tmp[i])
            
            if l == 1000:
                answer += 'M'*digit
            
            elif l == 100:
                if digit == 9:
                    answer = answer + 'CM'
                elif 4<digit<9:
                    answer = answer +'D'+'C'*(digit-5)
                elif digit ==4:
                    answer = answer +'CD'
                else:
                    answer = answer +'C'*(digit)
                    

            elif l == 10:
                if digit == 9:
                    answer = answer + 'XC'
                elif 4<digit<9:
                    answer = answer +'L'+'X'*(digit-5)
                elif digit ==4:
                    answer = answer +'XL'
                else:
                    answer = answer +'X'*(digit)
            
            
            else:
                if digit == 9:
                    answer = answer + 'IX'
                elif 4<digit<9:
                    answer = answer +'V'+'I'*(digit-5)
                elif digit ==4:
                    answer = answer +'IV'
                else:
                    answer = answer +'I'*(digit)
                    
        return answer

Others

class Solution(object):
    def intToRoman(self, num):
        """
        :type num: int
        :rtype: str
        """
        
        romans_digits = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        romans_letters = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
       
        roman = ""
        for i in range(len(romans_digits)):
            while num >= romans_digits[i]:
                roman += romans_letters[i]
                num -= romans_digits[i]
        return roman

다른 분이 올리신 최고로 빠른 코드인데, 큰 수 단위부터 하나씩 빼가면서 최종 결과를 만드는 방식.

이제 처음에는 0~3, 4, 5, 6~8, 9 이렇게 5가지 경우의 수에 대해서 1000/100/10/1 단위별로 계산이 필요하다고 생각했다.

아무튼 진짜 간결하게 잘 짠 코드갔다.

    
profile
I'm a student

0개의 댓글