언어/Python
TIL31 | CodeKata 로마자에서 숫자로 바꾸기
lee365
2021. 10. 25. 13:40
반응형
CodeKata Week 2
문제 1
로마자에서 숫자로 바꾸기 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):
# 구현
input
s = 'III'
s = 'XII'
s = 'XXVII'
output
3
12
27
나의 풀이
1) 1차 풀이 ❌️
roman = {
'I' : 1
, 'V' : 5
, 'X' : 10
, 'L' : 50
, 'C' : 100
, 'D' : 500
, 'M' : 1000
}
def roman_to_num_jieun(s):
result = 0
for i in range(len(s)-1, 0, -2):
if roman[s[i-1]] >= roman[s[i]]: # 정방향
result += (roman[s[i-1]] + roman[s[i]])
else: # 역방향
result += (roman[s[i]] - roman[s[i-1]])
if len(s) % 2 != 0:
result += roman[s[0]]
return result
- 뒤에서 2자리씩 비교하는 방식으로 이전요소가 기준요소보다 큰 경우 두 요소를 result에 더하고, 그 반대인 경우 두 요소의 차를 구한 뒤 result에 더하는 방식
- 두 요소를 한 번에 계산해서 푸는 방식이 잘못된 접근이였다.
- XLI 의 값을 입력했을 때 41이 나와야하는데 61 이라는 잘못된 값이 반환된다.
2) 2차 풀이 ⭕️
def roman_to_num(s):
result = 0
for i in range(len(s)):
if i < len(s)-1 and roman[s[i]] < roman[s[i+1]]:
result -= roman[s[i]]
else:
result += roman[s[i]]
return result
roman_to_num('XLI')
- 정방향으로 바로 뒤의 요소와 비교해서 뒷 요소보다 크면 result에 더하고, 작으면 빼는 방식
- 문자열의 길이가 홀수인 경우에는 else구문을 타서 마지막 요소는 result에 더해진다.
- 한자리씩 result에 더하기 때문에 예외없이 정상적으로 값이 반환된다.
반응형