로마자 숫자 표기로 문자열이 들어왔을 때,
그것을 숫자(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를 한 번씩 더 빼주어야 한다.