리트코드 알고리즘

(간단한 코드)리트코드 13. Roman to Integer

문학적 딥러닝 2024. 12. 5. 00:42

 

볼 때마다 헷갈렸고, 매번 같은 방식으로 풀어나가는 문제이다.

 

해답 코드는 다음과 같다.

class Solution:
    def romanToInt(self, s: str) -> int:
        roman = dict(I=1, V=5, X=10, L=50, C=100, D=500, M=1000)
        num = 0
        for i in range(len(s)-1):
            key, next_key = s[i], s[i+1]
            if roman[key] >= roman[next_key]:
                num += roman[key]
            else:
                num -= roman[key]
        
        return num + roman[s[-1]]

 

딕셔너리를 선언하는 방식은 여러가지인데, 딱히 어떤 것을 사용해도 상관이 없다. 

 

나는 그냥 dict()을 사용하면, 이게 한눈에 봐도 dictionary구나 라는게 보여서 애용하려고 한다.

 

그리고 또 하나 자주 헷갈리는 것은 for문의 범위 설정이다.

for i in range(1,len(a)):
	s[i-1], s[i]
    
for i in range(len(a)-1):
	s[i], s[i+1]

 

인덱스를 활용하기 위한 for문은 범위를 이런식으로 두가지 방식으로 활용할 수 있는데, 아직까지도 이것이 직관적으로 다가오지 않는다.

 

그저 코드를 짜고, index out of range와 같은 에러 메세지가 뜰 때 다른 방향으로 수정을 하는 형식으로 진행한다. 

 

나의 코드를 눈팅 했다면, 아마 return 이전 까지는 잘 이해가 됬을 것이다. 

key, next_key = s[i], s[i+1]

 

로마 문자에서 작은 숫자가 앞에 있는지 뒤에 있는지 확인하는 코드라는 것을 알아두자(알고 있으면 되었다)

 

근데, 이런 방식은 마지막 로마 문자를 확인할 때, 마지막 다음은 존재하지 않기 때문에 if문이 작동하지 않아(비교를 하지 않는다)

if roman[key] >= roman[next_key]:
    num += roman[key]
else:
    num -= roman[key]

 

그렇게 if문 안에 있는 코드 num += roman[key]가 작동하지 않는 것이다.

 

따라서 마지막 return에 맨 마지막 문자열이 의미하는 숫자를 더해주는 것이다.