LeetCode #13

Kiyong Lee·2022년 1월 5일
0

leetcode

목록 보기
3/20

13. Roman to Integer


1. 코드

class Solution:
    def romanToInt(self, s: str) -> int:
        rom_dic = {
            'I' : 1,
            'V' : 5,
            'X' : 10,
            'L' : 50,
            'C' : 100,
            'D' : 500,
            'M' : 1000
        }

        sum = 0
        current_value = rom_dic[s[0]]
        
        for i in range(1,len(s)) :
            if current_value >= rom_dic[s[i]] :
                sum += current_value
            
            else : sum -= current_value
            
            current_value = rom_dic[s[i]]
            
        return sum + rom_dic[s[-1]]

2. 풀이

우선 로마자에 맞는 값을 지정하기 위해 딕셔너리 형태로 변수 설정

원래 계획은

for i in range(len(s)) :
    if rom_dic[s[i]] < if rom_dic[s[i+1]] :

이렇게 하려고 했는데 list out of rage가 발생해서 값 갱신하는 거로 수정

초기 값인 current_value는 문자열 첫 번째 값으로 설정한 다음
계속 비교를 통해 바꾸는 방향으로 코드 작성

4, 9의 경우를 보면 결국 뒤의 로마자가 앞의 로마자보다 클 경우 빼는 것이기 때문에

현재 값과 그 다음에 올 로마자를 비교하여 문제에 나온 일반적인 열거 형태라면 그대로 합계에 +를 하고

4, 9가 나올 경우 합계에 -를 하게 만든 뒤

current_value를 그 다음 값으로 변경

그런데 이렇게하면 마지막 값에 대해 sum 계산이 이루어지지 않기 때문에
sum + 마지막값을 리턴해야 함


3. 그 외 답

d = {'M':1000, 'D':500, 'C':100, 'L':50, 'X':10, 'V':5, 'I':1}

def romanToInt(self, s):
    res, p = 0, 'I'
    for c in s[::-1]:
        res, p = res - d[c] if d[c] < d[p] else res + d[c], c
    return res

LeetCode에 어떤 사람이 4줄로 푼.. 답이다.

4, 9가 뒤에서 앞에 걸 빼다보니 역순으로 가져와서 문제를 풀었다.

어떻게 이렇게 풀 생각을 하지?

profile
ISTJ인 K-개발자

0개의 댓글