[Code Kata] 2st week-day1 def roman_to_num(s):

0

Code Kata

목록 보기
1/3
post-thumbnail

문제

로마자 표기법을 숫자로 바꿔보는 문제라고 할 수 있다.

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

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

SymbolValue
I1
V5
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

Solution

def roman_to_num(s):
  rom = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
  int = 0
  for i in range(len(s)):
      if i > 0 and rom[s[i]] > rom[s[i - 1]]:
          int += rom[s[i]] - 2 * rom[s[i - 1]]
      else:
          int += rom[s[i]]
  return int

나는 접근하다 1시간이 다되서 못 풀었지만, 시간을 넘어서 아래 모범답안처럼 풀었던거 같다.

다른팀도 접근 방식은 비슷했던거 같다. 그러나 위의 솔루션은 되게 간단하게 규칙을 찾아냈던것이 인상깊었다.

똑같이 일단 딕셔너리에 넣고 비교를 할 생각으로 시작을 하되 포인트는 원래 문자열에서

값과 거기서 하나를 빼준 값과 비교해서 거기서의 패턴을 발견하여 저렇게 더해서 넣어주고 그게 아니라면 원래 문자열 value에 값을 더해준 것이다.

Model solution

numbers = {
        "I" : 1,
        "IV" : 4,
        "V" : 5,
        "IX" : 9,
        "X" : 10,
        "XL" : 40,
        "L" : 50,
        "XC" : 90,
        "C" : 100,
        "CD" : 400,
        "D" : 500,
        "CM" : 900,
        "M" : 1000,
    }
def roman_to_num(s):
    if not s:
        return 0
    if numbers.get(s[:2]):
        return numbers.get(s[:2]) + roman_to_num(s[2:])
    return  numbers.get(s[:1]) + roman_to_num(s[1:])

아예 예외 처리 까지한 것을 전부 딕셔너리 형태로 저장해놓고 하는 걸로 우리팀이 생각한게 맞다 이렇게하면 복잡하게 규칙을 생각 할 필요 없이 xl 처럼 두 문자 붙는걸생각해서 2개 단위로 끊어서 더해주면 된다.

profile
문과생 개발자되다

0개의 댓글