로마자에서 숫자로 바꾸기 1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.
로마 숫자를 숫자로 표기하면 다음과 같습니다.
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다. III = 3 XII = 12 XXVII = 27입니다.
그런데 4를 표현할 때는 IIII가 아니라 IV 입니다. 뒤의 숫자에서 앞의 숫자를 빼주면 됩니다. 9는 IX입니다.
I는 V와 X앞에 와서 4, 9 X는 L, C앞에 와서 40, 90 C는 D, M앞에 와서 400, 900입니다.
from itertools import zip_longest
def roman_to_num(s):
# 여기에 코드를 작성해주세요.
num = {"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}
answer = 0
s = list(s)
for i,j in zip_longest(s[::], s[1::], fillvalue=" ") :
if i+j in num :
answer += num[i+j]
s.remove(i)
s.remove(j)
for i in s :
answer += num[i]
return answer
다음의 과정에 따라 풀이하였다.
num = {"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}
경우의 수가 그렇게 많지 않아서 그냥 딕셔너리에 몽땅 선언해 주었다.
s
를 한글자씩 쪼개 리스트에 담아준다. 그리고 숫자의 합을 담을 변수 answer
를 선언한다.answer = 0
s = list(s)
for i,j in zip_longest(s[::], s[1::], fillvalue=" ") :
if i+j in num :
answer += num[i+j]
s.remove(i)
s.remove(j)
for i in s :
answer += num[i]
return answer
zip_longest는 각 iterable에서 요소를 집계하는 iterator를 만든다. iterable의 길이가 같지 않다면 누락된 값을 fillvalue 값으로 채워진다.
만약 i
+j
값이 IV
처럼 num
딕셔너리 안에 존재한다면 그 값을 answer
에 더해주고 i
와 j
값을 지워준다.
윗 반복문 종료 후에도 남아있는 로마자가 있다면 num
딕셔너리에 있는 value
값으로 더해준다.
문제 볼 땐 쉬운데? 싶었는데.. 생각보다 오래걸렸다. 야매로 푼 것 같긴 하지만 풀리면 장땡🤤