TIL31 | CodeKata 로마자에서 숫자로 바꾸기
2021. 10. 25. 13:40ㆍ언어/Python
반응형
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에 더하기 때문에 예외없이 정상적으로 값이 반환된다.
반응형
'언어 > Python' 카테고리의 다른 글
TIL39 | CodeKata 가장 자주 등장한 숫자 출력하기, 물을 담을 수 있는 가장 넓은 면적 (0) | 2021.10.29 |
---|---|
TIL38 | CodeKata 숫자 중에서 과반수가 넘은 숫자 찾기, 여러 괄호 규칙 짝 맞추기 (0) | 2021.10.27 |
TIL30 | CodeKata 중복되지 않은 알파벳 중 제일 긴 단어, 뒤집은 모양이 같은 숫자 찾기, ⭐️공통된 시작 단어 찾기 (0) | 2021.10.22 |
TIL29 | Django C.R.U.D : Wrap up 정리 (0) | 2021.10.20 |
TIL28 | Many-to-Many관계, Django의 ManyToManyField (0) | 2021.10.20 |