Python: Code Taka 1주차 6~ 2주차 1

dev-swd·2020년 11월 15일
0

Code Taka

목록 보기
6/12

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

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):
    if not s:
        return 0
    roman_key = ("I", "V", "X", "L", "C", "D", "M")
    roman_val = (1, 5, 10, 50, 100, 500, 1000)
    roman_dic = dict(zip(roman_key, roman_val))
    result = 0
    temp = s
    while temp:
        count = 0
        if count < len(temp) - 1 and roman_dic[temp[count]] < \
            roman_dic[temp[count + 1]]:
            result += roman_dic[temp[count + 1]] - roman_dic[temp[count]]
            temp = temp[count + 2:]
        else:
            result += roman_dic[temp[count]]
            temp = temp[count + 1:]
    
    return result
  1. 로마 문자열이 들어오고, 각 문자에 값이 있으므로 키, 값 형태의 딕셔너리를 만든다.
  2. 합계를 저장할 result 변수를 만들고, 문자열 s 를 다시 저장할 temp 변수를 만든다.
  3. I, X, C 가 특정 문자의 앞에 위치 했을 때 4, 9, 40, 90, 400, 900 이 되는 것을 이용하여, 문자열의 첫번째와 두번째를 비교한다.
  4. 첫번째 문자와 매치되는 값이 두번째 문자열의 값 보다 작을 경우, 두번째 문자열이 가지고 있는 값에서 첫번째 문자열이 가지고 있는 값을 뺀 후, 그 값을 result 에 저장한다.
  5. 첫번째 문자와 매치되는 값이 두번째 문자열의 값보다 작거나 같을 경우, 첫번째 문자열의 값을 result 에 더해준다.
  6. 4번의 경우 문자열 s에서 두번째 값까지 자른 후의 문자열 s를 temp 에 대입한다.
  7. 5번의 경우 문자열 s에서 첫번째 값을 자른 후의 문자열 s 를 temp 에 대입한다.
  8. 이러한 방식으로 temp 문자열이 다 잘려나가고 없을 때 while 문이 종료되고, 총 합계를 도출할 수 있다.

솔루션

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:])

느낀점

  1. 문자를 자르는 방식으로 진행을 한다면 재귀함수로 충분히 가능할 것 같다고 느꼈다.
  2. 굳이 temp 변수를 사용하지 않고 파라미터로 받은 s 값을 이용해도 되었다. 다만, 문자열 s 를 오염시키고 싶지 않아서 temp 를 선언하였다.
profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글