[알고리즘] 로마자 숫자로 반환하기

hamingu·2021년 5월 4일
0

알고리즘

목록 보기
3/6

오늘은 특별하게 설명할 함수가 없다..쩝

문제

로마자를 인자로 받아 로마자가 의미하는 숫자를 반환해준다.

로마자 종류
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):
  roman_dicts = {
    "I" : 1,
    "V" : 5,
    "X" : 10,
    "L" : 50,
    "C" : 100,
    "D" : 500,
    "M" : 1000
  }
  roman_int = 0
  for i in range(len(s)):
    if i > 0 and roman_dicts[s[i]] > roman_dicts[s[i-1]]:
      roman_int += roman_dicts[s[i]] - 2 * roman_dicts[s[i-1]]
    else:
      roman_int += roman_dicts[s[i]]
  return roman_int

풀이

  1. 각 로마자가 의미하는 숫자를 딕셔너리에 저장한다.
  2. 로마자를 더해나갈 int 값을 변수로 지정한다.
  3. 앞의 숫자가 뒤의 숫자보다 크거나 같을 경우 그대로 더하고 뒤의 숫자가 더 클경우 뒤의 숫자에서 앞의 숫자를 빼는 2가지 규칙을 적용한다.
  4. for문을 돌려 입력된 로마자 값이 2가지 규칙 중 어디에 해당되는지 확인하여 int에 더해준다.

굉장히 어려운 문제였다. 사실 풀이 설명을 깊게 하기 힘들정도로 그냥 로마자라는 자체가 머리를 아프게 했다. 구현해놓고도 순간 이해가 안되어 동기에게 설명을 못하는 순간도 있었다.

정신없이 생각나는대로 구현하는 것도 좋지만 내가 뭘 구현하는지 정확하게 설명할 수 있도록 연습하는 습관이 필요하다는 걸 뼈저리게 느낀 하루..

profile
프로그래밍구

0개의 댓글