https://leetcode.com/problems/roman-to-integer/
문자열로 주어진 로마 숫자를 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)
제출하고 다른사람 답 보다가 기발하고 웃긴게 있어서 가져와봤다.