로마자에서 숫자로 바꾸기 1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.
Symbol:Value
I:1, V:5, X:10, L:50, C:100, D:500, M:1000
로마자는 4 9는 뒤에서 앞자리수를 뺀다
4는 V에 IV로 5에서 1을 뺀다
그러니 앞에 값과 뒤의 값을 비교한 뒤에 앞보다 뒤가 크면 4또는 9라는 이야기니 뒤에서 앞을 빼고
앞보다 뒤가 작으면 4와 9의 형태가 아니니 그냥 앞과 뒤를 더하면 되지않을까?
코드를 적어봤다.
def roman_to_num(s):
dic= {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
for i in range(0, len(s)):
if i > 0:
if dic[s[i]] > dic[s[i-1]]:
result += dic[s[i]] - dic[s[i-1]]
else:
result += dic[s[i]]
else:
if dic[s[i]] > dic[s[i-1]]:
result = 0
else:
result += dic[s[i]]
return result
결과 : 실패
0번 인덱스와 1번 인덱스 즉 가장 앞자리의 비교는 문제없다.
하지만 그 뒤에서 다시말하면 앞자리 다음 자릿수부터 앞보다 뒤가 큰 경우 그 앞앞 에서 한번더하고 다시빼는걸로 인해 제자리가된다.
무슨말이나면 예를들어 989의경우 CMLXXXIV의 형태인데 CMLXXX까지는 문제없다 하지만 X랑 I랑 비교해서 X가 더크니 일단 X에 I를 더하고 그뒤에 I랑 V랑 비교해서 I보다 V가 더크니 빼는 형태라 결국 제자리이다.
위의 로직대로 처리되면 990이 나온다.
def roman_to_num(s):
dic= {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
result = 0
for i in range(0, len(s)):
if i > 0:
if dic[s[i]] > dic[s[i-1]]:
result += dic[s[i]] - dic[s[i-1]]*2
else:
result += dic[s[i]]
else:
result += dic[s[i]]
return result