code-taka 06(roman_to_num)

Nicholas·2022년 5월 21일
0

Algorithm & DataStructure

목록 보기
6/12

문제

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

로마 숫자를 숫자로 표기하면 다음과 같습니다.

Symbol:Value
I:1, V:5, X:10, L:50, C:100, D:500, M:1000

풀이

1차생각

로마자는 4 9는 뒤에서 앞자리수를 뺀다
4는 V에 IV로 5에서 1을 뺀다
그러니 앞에 값과 뒤의 값을 비교한 뒤에 앞보다 뒤가 크면 4또는 9라는 이야기니 뒤에서 앞을 빼고
앞보다 뒤가 작으면 4와 9의 형태가 아니니 그냥 앞과 뒤를 더하면 되지않을까?
코드를 적어봤다.

def roman_to_num(s):
    dic= {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    result = 0 
    for i in range(0, len(s)):
        if i > 0:
            if dic[s[i]] > dic[s[i-1]]:
                result += dic[s[i]] - dic[s[i-1]]
            else:
                result += dic[s[i]]
        else:
            if dic[s[i]] > dic[s[i-1]]:
                result = 0
            else:
                result += dic[s[i]]    
    return result

결과 : 실패
0번 인덱스와 1번 인덱스 즉 가장 앞자리의 비교는 문제없다.
하지만 그 뒤에서 다시말하면 앞자리 다음 자릿수부터 앞보다 뒤가 큰 경우 그 앞앞 에서 한번더하고 다시빼는걸로 인해 제자리가된다.
무슨말이나면 예를들어 989의경우 CMLXXXIV의 형태인데 CMLXXX까지는 문제없다 하지만 X랑 I랑 비교해서 X가 더크니 일단 X에 I를 더하고 그뒤에 I랑 V랑 비교해서 I보다 V가 더크니 빼는 형태라 결국 제자리이다.
위의 로직대로 처리되면 990이 나온다.

1차생각에서의 오류 수정

  • 처음부터 무조건 다더하는데 앞자리와 뒷자리랑 비교해서 뒷자리가 큰경우는 인덱스i에서 인덱스i-1을 뺄때 2배를 빼면 해결된다.
def roman_to_num(s):
    dic= {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    result = 0 
    for i in range(0, len(s)):
        if i > 0:
            if dic[s[i]] > dic[s[i-1]]:
                result += dic[s[i]] - dic[s[i-1]]*2
            else:
                result += dic[s[i]]
        else:
                result += dic[s[i]]    
    return result

참고한 블로그

profile
WEB Developer

0개의 댓글