본문 바로가기

Programming General/LeetCode

13. Roman to integer

https://leetcode.com/problems/roman-to-integer/

 

Roman to Integer - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

문자열로 주어진 로마 숫자를 10진수 정수로 바꾸는 문제다.

 

예를 들어 "III"은 3, "V"은 5다. 일반적으로 로마자는 큰 글자부터 작은 글자까지 나열하고, 글자들을 더한 합이 최종 숫자가 된다. 예를들면 8은 "VIII" (5 + 3). 하지만 예외적으로 4같은 경우는 "IIII"로 쓰지 않고 "IV" (5 - 1) 로 쓰는 법칙이 있다. 이는 9에도 적용된다.("IX")

 

그래서 이런 예외법칙도 적용하여 로마숫자를 10진수로 바꾸는게 이 문제의 핵심이다.

 

처음에는 if 문으로 분기를 다 타려했으나 비효율적이고 일반화할 수 있음을 깨닫고, 맵(딕셔너리)을 만들어서 해결했다.

각 로마자 변환을 추상/일반화 할 수 있는지가 이 문제의 핵심이었던 듯.

오랜만에 파이썬 코딩하니까 너무 어색하다. 주석도 //를 쓰고, print도 자꾸 println 쓰고, 변수 선언할때 val 안쓰는것도 계속 틀려서 고생;; 그리고 왜 자꾸 None이 리턴되나 했더니 함수 마지막에 return을 안써줘서였다. 이런.. 그래도 오랜만에 파이썬 코딩하니 재밌네.

 

def romanToInt(s: str) -> int:
    roman = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
    total = 0
    length = len(s)
    for i, c in enumerate(s[:-1]):
        add = roman[c]
        if roman[s[i+1]] > roman[c]:
            add *= -1
        total += add
    total += roman[s[-1]]  # 마지막 글자는 항상 더한다. 다른사람 답 보다가 알게됨.
    return total

Time Complexity: O(N); N = 문자열 길이

Space Complexity: O(1)


제출하고 다른사람 답 보다가 기발하고 웃긴게 있어서 가져와봤다.