TIL - CodeKata(6)

김영훈·2021년 4월 5일
0

ETC

목록 보기
7/34

# 문제

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

# 나의 풀이

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

    if s == '':
        return 0
    else: 
        i = 0
        while i < len(s):
         
            if i == len(s)-1:
                a = symbol_value['{}'.format(s[i])]
                result += a
                i += 1

            elif  symbol_value['{}'.format(s[i])] < symbol_value['{}'.format(s[i+1])]:   
                result += (symbol_value['{}'.format(s[i+1])] - symbol_value['{}'.format(s[i])])
                i += 2
                                
            else:
                a = symbol_value['{}'.format(s[i])]
                result += a
                i += 1
                
        return result

# 나의 풀이

  • 각각의 로마자에 대응하는 숫자를 불러와서 결괏값 계산에 사용해야 하므로, Symbol과 Value데이터를 딕셔너리 객체에 담았다.

  • 본래 for문으로 인자 s의 문자열을 하나씩 꺼내서 대응하는 value값을 더해 가려 했지만, for문에서는 인덱스값을 한 번에 2씩 증가시키는 게 어렵다는 것을 깨닫고, while문으로 선회했다.

  • 아래처럼 인덱스가 인접한 값(i, i+1)을 비교하는 코드에서는 마지막 인덱스에서 필연적으로 index out of range Error와 마주치게 된다. 이에 대한 예외 처리를 하는 방법엔 여러 가지가 있을 것이다. try,except 처리를 하거나, if문으로 예외처리를 해도 된다. 나의 경우 if문을 선택했다.

elif  symbol_value['{}'.format(s[i])] < symbol_value['{}'.format(s[i+1])]:
profile
Difference & Repetition

0개의 댓글