[알고리즘 문제풀이] 코드카타 5

나른한 개발자·2022년 1월 16일
0

문제풀이

목록 보기
5/13

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

-입력: 로마자로 표현된 숫자(문자열)
-출력: 아라비아 숫자

풀이과정

  • 입력된 문자열을 반복문을 돌며 key에 맞는 value를 더해준다.
  • 직전 문자(i-1자리의 문자)보다 value값이 크다면 현재 문자의 값에서 직전 문자의 값을 빼준다.

코드

def roman_to_num(s):
  rom_dict = {
    'I': 1,
    'V' : 5,
    'X' : 10,
    'L' : 50,
    'C' : 100,
    'D' : 500,
    'M' : 1000
  }
  result = 0


  for i, letter in enumerate(s):
    result += rom_dict[letter]

    if i !=0 and rom_dict[letter] > rom_dict[s[i-1]]:
      result -= rom_dict[s[i-1]] *2
  
  return result
  
 print(roman_to_num('MCMXCIV')) # 결과: 1994
 print(roman_to_num('IV')) # 결과: 4
 print(roman_to_num('III')) # 결과: 3

+)

현재 위치의 문자가 직전 문자의 값보다 크다면 현재 문자의 값 - 직전 문자의 값 을 하도록 되어있다.

하지만 'MCMXCIV'가 입력으로 주어졌을 때를 보면 알 수 있듯이, 단순히 직전 값을 빼주게 되면 이전 반복에서 더해준 값이 그대로 남아있게 되니 직전 문자 값 * 2만큼을 빼주어야 한다.

profile
Start fast to fail fast

0개의 댓글