로마자를 입력받아 숫자로 만들기!

BG·2021년 5월 31일
0

ALGORITHM

목록 보기
1/7

문제

로마자에서 숫자로 바꾸기 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

나의 풀이

처음에 숫자를 넣으면 로마자가 나와야 되는줄 알고 삽질을 좀 했었네요...
문제는 아래의 과정으로 풀이 했습니다~
(스택으로 차근차근 쌓아서 마지막 값과 현재값을 비교하는 방식으로 접근했습니다.)

  • 입력으로 주어지는 문자열을 하나씩 입력 받아 숫자로 치환한다.
  • 일반적인 경우(4나 9와 같은 경우를 제외)에는 앞의 숫자 보다 뒤의 숫자가 클수 없다.
    ex) XXVII == 27
    규칙상 큰수를 아래와 같이 먼저 표기하는 방법이기 때문에 뒤에 나오는 숫자가 더 클수는 없다.
    첫번째 값 : X --> 10
    두번째 값 : X --> 10
    세번째 값 : V --> 5
    네번째 값 : I --> 1
    다섯번째 값 : I --> 1
  • 예외적인 경우만 따로 로직을 분리 하자.
  • 치환한 숫자들을 순차적으로 리스트에 담는다.
  • 리스트 마지막에 담긴 숫자와 현재 값을 비교하여 현재값이 더 크다면 예외적인 경우이므로 리스트에 담긴 숫자를 pop()으로 제거를 하고 그 제거한 숫자와 현재값을 마이너스 시켜 다시 리스트에 담는다.
  • 리스트에 담은 모든 값을 더한다.
dict = {
  "I":1,
  "V":5,
  "X":10,
  "L":50,
  "C":100,
  "D":500,
  "M":1000
}

def roman_to_num(s):
  sum = 0
  list = []
  list.append(dict[s[0]])

  for i in range(1,len(s)):
    if list[len(list) - 1] >= dict[s[i]]:
      list.append(dict[s[i]])
    else:
      list.pop()
      list.append(dict[s[i]] - dict[s[i-1]])

  for i in list: sum+=i

  return sum

print(roman_to_num('IV'))
profile
글쎄...?

0개의 댓글