class Solution:
def romanToInt(self, s: str) -> int:
rom_dic = {
'I' : 1,
'V' : 5,
'X' : 10,
'L' : 50,
'C' : 100,
'D' : 500,
'M' : 1000
}
sum = 0
current_value = rom_dic[s[0]]
for i in range(1,len(s)) :
if current_value >= rom_dic[s[i]] :
sum += current_value
else : sum -= current_value
current_value = rom_dic[s[i]]
return sum + rom_dic[s[-1]]
우선 로마자에 맞는 값을 지정하기 위해 딕셔너리 형태로 변수 설정
원래 계획은
for i in range(len(s)) :
if rom_dic[s[i]] < if rom_dic[s[i+1]] :
이렇게 하려고 했는데 list out of rage
가 발생해서 값 갱신하는 거로 수정
초기 값인 current_value
는 문자열 첫 번째 값으로 설정한 다음
계속 비교를 통해 바꾸는 방향으로 코드 작성
4, 9의 경우를 보면 결국 뒤의 로마자가 앞의 로마자보다 클 경우 빼는 것이기 때문에
현재 값과 그 다음에 올 로마자를 비교하여 문제에 나온 일반적인 열거 형태라면 그대로 합계에 +
를 하고
4, 9가 나올 경우 합계에 -
를 하게 만든 뒤
current_value
를 그 다음 값으로 변경
그런데 이렇게하면 마지막 값에 대해 sum 계산이 이루어지지 않기 때문에
sum
+ 마지막값을 리턴해야 함
d = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}
def romanToInt(self, s):
res, p = 0, 'I'
for c in s[::-1]:
res, p = res - d[c] if d[c] < d[p] else res + d[c], c
return res
LeetCode에 어떤 사람이 4줄로 푼.. 답이다.
4, 9가 뒤에서 앞에 걸 빼다보니 역순으로 가져와서 문제를 풀었다.
어떻게 이렇게 풀 생각을 하지?