로마자는 왼쪽부터 오른쪽으로 큰 수부터 작은 수 순으로 정렬하기 때문에 작은 수에 해당하는 로마자가 큰 수에 해당하는 로마자보다 앞에 나올 경우 빼면 된다.
class Solution:
def romanToInt(self, s: str) -> int:
res = 0
dict = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
for i in range(len(s)): # 문자열을 iteration
# 현재 index가 아닌 다음 index가 문자열 길이보다 작고,
# 다음 로마자가 현재 로마자보다 크다면
if ( (i + 1) < len(s) ) and dict[s[i + 1]] > dict[s[i]]:
res -= dict[s[i]] # 현재 로마자에 해당하는 값을 뺀다
else: # 마지막 로마자이거나 다음 로마자가 현재 로마자보다 작다면
res += dict[s[i]] # 현재 로마자에 해당하는 값은 더한다.
return res
dict()
에 두 문자로 이루어진 키-값 쌍도 정의한 후 input 값에서 두 문자로 이루어진 키 값을 찾는다. 못 찾으면 예외처리로 한 문자로 이루어진 키의 값을 더한다.
class Solution:
def romanToInt(self, s: str) -> int:
dict = {
'I': 1,
'IV': 4,
'V': 5,
'IX': 9,
'X': 10,
'XL': 40,
'L': 50,
'XC': 90,
'C': 100,
'CD': 400,
'D': 500,
'CM': 900,
'M':1000
}
res, i = 0, 0
while i < len(s):
try:
res += dict[s[i] + s[i + 1]] # dict에서 두 문자로 이루어진 키의 값을 찾아 더한다
i += 2 # input 문자열의 index를 2칸 건너뛴다
except (KeyError, IndexError): # 두 문자로 이루어진 키가 없거나 input값의 끝인 경우 예외 처리
res += dict[s[i]] # dict에서 한 문자로 이루어진 키의 값을 찾아 더한다
i += 1 # input 문자열의 index를 1칸 건너뛴다
return res