로마자 숫자 표기로 문자열이 들어왔을 때,
그것을 숫자(1~3999)로 반환하는 함수를 만들어라
Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
로마자로 숫자로 표기 할 때는,
Symbol에 대응하는 기호의 갯수 만큼 value를 갖게 된다.
ex) III
= 3, XX
= 20, DCL
= 650
그러나
4, 40, 400는
IIII
,XXXX
,CCCC
가 아닌IV
,XL
,CD
으로, (5-1, 50-10, 500-100) 표기 한다.
9, 90, 900는
VIIII
,LXXXX
,DCCCC
가
아닌IX
,XC
,CM
으로 (10-1, 100-10, 1000-100) 표기 한다.
s = III
->3
반환,
s = IX
->9
반환,
s = MCMXCIX
-> 1999 반환
def roman_to_num(s):
#step1
romans = ['I', 'V', 'X', 'L', 'C', 'D', 'M', 'F']
nums = [1, 5, 10, 50, 100, 500, 1000, 5000]
result = 0
#step2
for i in range(len(romans)):
result += s.count(romans[i]) * nums[i]
#step3
if i % 2 == 0 and i < 6:
forth = romans[i] + romans[i+1]
ninth = romans[i] + romans[i+2]
result -= s.count(forth) * nums[i] * 2
result -= s.count(ninth) * nums[i] * 2
return result
def roman_to_num(s):
romans=['I', 'V', 'X', 'L', 'C', 'D', 'M', 'F']
nums = [1, 5, 10, 50, 100, 500, 1000, 5000]
result = 0
로마 기호를 담을 romans
,
기호에 대응 하는 숫자를 담을 nums
결과를 담을 result
선언
for i in range(len(romans)):
result += s.count(romans[i]) * nums[i]
로마자 표기로 들어온 입력s
에 있는
특정 로마자 기호의 갯수를
그 기호에 해당하는 수와 곱해 result
에 더한다.
for i in range(len(romans)):
result += s.count(romans[i]) * nums[i]
if i%2==0 and i<6:
forth = romans[i] + romans[i+1]
ninth = romans[i] + romans[i+2]
result -= s.count(forth) * nums[i] * 2
result -= s.count(ninth) * nums[i] * 2
return result
4, 9, 40, 90, 400, 900 (예외적인 숫자) 에
해당하는 (IV
,IX
, XL
, XC
, LC
,LM
)이 들어오면,
(I, X, L
에 해당 하는 숫자) 를
result
에서 뺀다
I, X, L
)을 한 번 빼준다I,X,L
이 , 단위 숫자 앞에 오면, I, X, L
에 해당하는 숫자를 빼서 숫자를 표기 하기 때문
XCIX
= 99
step 2에서
result
는
을 계산해서
이 된다.
step3
그런데 XC
, IX
의 경우 (100 - 10, 10 - 1)
이 되어야 함으로,
먼저 앞서 잘못 더한 X
, I
에 해당하는 10, 1을 한번 씩 빼주어야 한다
그런 다음 올바른 답을 도출하기 위해 X
, I
를 한 번씩 더 빼주어야 한다.