CK 021 | Week2 - Day 1

This Is Empty.·2021년 9월 27일
0

codekata

목록 보기
21/35

문제

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

내가 작성한 코드

from itertools import zip_longest 
def roman_to_num(s):
  # 여기에 코드를 작성해주세요.
  num = {"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}
  answer = 0
  s = list(s)
  for i,j in zip_longest(s[::], s[1::], fillvalue=" ") :
    if i+j in num :
      answer += num[i+j]
      s.remove(i)
      s.remove(j)
  
  for i in s :
    answer += num[i]
  return answer

다음의 과정에 따라 풀이하였다.

  1. 일단 만들 수 있는 모든 로마자를 딕셔너리 안에 넣어주었다.
num = {"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}

경우의 수가 그렇게 많지 않아서 그냥 딕셔너리에 몽땅 선언해 주었다.

  1. 문자열 s를 한글자씩 쪼개 리스트에 담아준다. 그리고 숫자의 합을 담을 변수 answer를 선언한다.
answer = 0
s = list(s)
  1. 반복문을 사용해 풀이한다.
for i,j in zip_longest(s[::], s[1::], fillvalue=" ") :
    if i+j in num :
      answer += num[i+j]
      s.remove(i)
      s.remove(j)
for i in s :
    answer += num[i]
 
return answer

zip_longest는 각 iterable에서 요소를 집계하는 iterator를 만든다. iterable의 길이가 같지 않다면 누락된 값을 fillvalue 값으로 채워진다.
만약 i+j값이 IV처럼 num딕셔너리 안에 존재한다면 그 값을 answer에 더해주고 ij값을 지워준다.

윗 반복문 종료 후에도 남아있는 로마자가 있다면 num딕셔너리에 있는 value값으로 더해준다.

문제 볼 땐 쉬운데? 싶었는데.. 생각보다 오래걸렸다. 야매로 푼 것 같긴 하지만 풀리면 장땡🤤

profile
Convinced myself, I seek not to convince.

0개의 댓글