로마자에서 숫자로 바꾸기 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
문제 중점 파악
- 각 로만 숫자와 대응되는 아라비안 숫자로 리턴
- 로만 숫자만의 특별한 조합식으로 나오는 아라비안식 숫자로 리턴
- 4,9, 40, 90 , 400 ,900 분리해서 읽기
해결 방식
- 로만 숫자와 아라비안 숫자를 딕서너리로 저장
- 술자를 list 형식으로 변환 후, enumaerate for문을 사용하여 1번째를 제외한 전 인덱스 벨류값과 현재 값을 더한 값을 구한다. 이 값들 중 특별하게 분리해서 읽어야하는 로만 숫자 제외하고 값들을 더하기
-마지막으로 분리된 값의 특정 값을 더해 리턴하기
def roman_to_num(s):
#일반 로만 숫자 딕셔너리
roman_num = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
#특수 로만 숫자 저장
roman_subtract = {
'IV': 4,
'IX': 9,
'XL': 40,
'XC': 90,
'CD': 400,
'CM': 900,
}
#인자 리스트로 변환
s_lst = list(s)
#첫번째 숫자를 건너뛰기 위한
first = True
sum_subtract = 0
copy_lst = []
#에뉴머레이트를 이용해 해당 로만숫자를 분리, 특수 로만 숫자 따로 리스트 작성
for index, i in enumerate(s_lst):
if first:
first = False
continue
before = s_lst[index - 1]
now = i
rom = before + now
if rom in roman_subtract:
sum_subtract = sum_subtract + roman_subtract[rom]
copy_lst.append(index - 1)
copy_lst.append(index)
#특수 로만 숫자 원 리스트에서 분리
for i in copy_lst[::-1]:
s_lst.pop(i)
a=0
#일반 로만 숫자의 아라비안 숫자 합 합 구하기
for k in s_lst:
a = a+ roman_num[k]
#일반 로만숫자와 특수로만숫자의 아라비안 숫자 합치기
return a+sum_subtract
enumerate 함수를 이용하여 key값과 value 값을 같이 for문을 돌리며 추출하는 방법을 배웠다. key값의 로직을 이용해 결과 되는 value 값을 구하는데 용이하게 사용될 듯하다.