Q.
로마자에서 숫자로 바꾸기 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
def roman_to_num(s):
Rev_dic = {'CM' : 900, 'CD' : 400,
'XC' : 90, 'XL' : 40, 'IX' : 9, 'IV' : 4}
Dic = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
ans = 0
for rev in Rev_dic:
if rev in s:
ans+=Rev_dic[rev]
s=s.replace(rev,"")
for letters in s:
ans+=Dic[letters]
return ans
4, 9, 40, 90, ... 등의 숫자는 IV 처럼 더 작은 수를 뜻하는 문자 I가 더 큰 수를 뜻하는 문자 V앞에 나오게 된다. 따라서 역순으로 배열된 문자들만 따로 값을 주고 나머지 문자들은 문자 그대로 값을 부여하여 더하면 된다.
물론 INPUT값의 범위가 더 넓어졌을 때 Rev_dic 에 계속 값들을 입력해줘야하기 때문에 확장성이 뛰어난 코드는 아니라고 생각한다.
For문을 이용하여 앞에 나온 문자의 값이 뒤의 문자의 값보다 작을때 빼주는 로직으로 작성하면 확장성을 더욱 고려한 코드를 구현 가능하다.