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에 더하기 때문에 예외없이 정상적으로 값이 반환된다.
반응형