[CodeKata] def roman_to_num(s):

GYUBIN ·2021년 11월 7일
0

코딩테스트 준비

목록 보기
8/10

문제

로마자에서 숫자로 바꾸기 1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요.

로마 숫자를 숫자로 표기하면 다음과 같습니다.

SymbolValue
I1
V5
X10
X10
L50
C100
D500
M1000

로마자를 숫자로 읽는 방법은 로마자를 왼쪽부터 차례대로 더하면 됩니다. 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

풀이

  result = 0
  roman_dict = {'I' : 1, 'V' : 5, 'X' : 10, 'L' : 50, 'C' : 100, 'D' : 500, 'M' : 1000}
  for i in range(len(s)):
    if i+1 == len(s):
      result += roman_dict.get(s[i])
    else:
      if roman_dict.get(s[i]) >= roman_dict.get(s[i+1]):
        result += roman_dict.get(s[i])
      else:
        result -= roman_dict.get(s[i])
  return result

딕셔너리로 해당 로마자에 해당하는 숫자를 모두 대입해준다
input 값의 길이만큼 반복문을 돌려주는데 이 때

if i+1 == len(s):
     result += roman_dict.get(s[i])

사용하는 이유는 string index out of range 가 발생하기 때문이다

그 후에는 roman_dict.get(s[i]) >= roman_dict.get(s[i+1])를 통해 앞의 숫자가 뒤의 숫자보다 크다면 +를, 작다면 - 시켜준다

result에 모두 더한 값을 리턴시켜주면 문제에 해당하는 답이 나오게 된다

해당 문제는 다른 방법으로 풀기 위해서 많은 고민을 해봤지만 일단 떠오르는 아이디어는
로마자에서 예외적으로 사용되는 'CM' or 'CD' or 'XC' or 'XL' or 'IX' or 'IV'을 먼저 처리하고 replace를 통해 삭제한 후 남은 input 값을 순서대로 더하는 방법이 있다

하지만 식으로 구현하는 것에 계속 실패해서 풀이로 가져오지는 못했다

추후에 다른 아이디어가 떠오른다면 추가로 작성해보자

0개의 댓글