파이썬(python) 1~3999사이의 s인자를 로마자를 숫자로 바꾸기

이정민·2021년 5월 31일
0

문제 )

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


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

코드분석

여기서 중요한 힌트를 찾아냈다.

  1. IV = 4 , IX = 9
  2. 4와 9는 앞과뒤를 빼면 4와 9과 된다는 것

크게 문장들을 분리하면

  1. for 문에서 문자열의 인덱스 갯수만큼 반복시킨다.
  2. if 문에서는 4와 9 같이 앞의 문자보다 뒤의 문자가 숫자가 클때 그리고 문자열 인덱스가 0보다 클 때 적용된다.
  3. else 문에서는 문자열 첫번째 인덱스와 4와 9를 뺀 나머지 숫자들이 들어오게 되는 문장이 된다.

그럼 자세하게 들어가보자

만약 s = IV 라면 for문에서 0~1 반복한다.
처음 0이 들어가면 if문에서는 성립되지 않아 else문으로 간다.
rom[s[i]]에서 s[i]는 문자열 인덱스를 말한다. 즉 s[0]는 I가 된다. rom[I]는 dictionary에서 1이라는 value값을 가진다. 그렇기 때문에 int에 1이 저장된다.

마찬가지로 1이 반복될때는 0보다 크고, 뒤에 숫자가 앞의 숫자보다 크기 때문에 if문이 성립하게 된다.
5 - 2 가 되어서 int에 3이 들어가게된다.

여기서 -2를 곱해주는 이유는 앞에 else문에서 rom[s[i]]이
if문 rom[s[i - 1]]과 같기 때문에 if문에서 else문에 있던 숫자를 상쇄하기 위해서 -2를 곱해서 없애준다.

.
.
.
.

처음 문제를 풀면서 어려웠지만 계속 보다보니 이해가 되었던 문제였다.

profile
안녕하세요.

0개의 댓글