로마자에서 숫자로 바꾸기 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]]
여기서 중요한 힌트를 찾아냈다.
- IV = 4 , IX = 9
- 4와 9는 앞과뒤를 빼면 4와 9과 된다는 것
크게 문장들을 분리하면
- for 문에서 문자열의 인덱스 갯수만큼 반복시킨다.
- if 문에서는 4와 9 같이 앞의 문자보다 뒤의 문자가 숫자가 클때 그리고 문자열 인덱스가 0보다 클 때 적용된다.
- 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를 곱해서 없애준다.
.
.
.
.
처음 문제를 풀면서 어려웠지만 계속 보다보니 이해가 되었던 문제였다.