본문 바로가기
프로젝트들/코딩 테스트

[코딩 테스트] 리트코드 13 - Roman to Integer (Easy) in Python

by 코곰 2021. 5. 22.

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.

 

로마자로 주어진 입력을 숫자로 변환하세요!

 

Symbol Value

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

 

Example 1:

Input: s = "III"

Output: 3

 

Example 2:

Input: s = "IV"

Output: 4

 

Example 3:

Input: s = "IX"

Output: 9

 

Example 4:

Input: s = "LVIII"

Output: 58

Explanation: L = 50, V= 5, III = 3.

 

Example 5:

Input: s = "MCMXCIV"

Output: 1994

Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

 

풀이

변환방법을 O(1)에 탐색 가능하게 dictionary에 저장하고, 

입력 문자열을 두 글자씩 탐색하면서 (I가 다른 문자의 앞에 붙으면 다른 숫자가 되므로) 변환.

 

class Solution:
    def romanToInt(self, s: str) -> int:
        n = len(s)
        i = 0
        answer = 0
        dic = {
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000, 
            'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900
        }
        while i < n:
            if s[i:i+2] in dic:
                answer += dic[s[i:i+2]]
                i += 2 
            else:
                answer += dic[s[i]]
                i += 1
        return answer

 

위처럼 가능한 모든 케이스를 dictionary에 넣어주는 방법도 있고,

조금만 더 머리를 써서

'현재 탐색중인 문자열이 바로 다음 문자열보다 작다면  빼주는'논리를 써도 좋아 보였다! (Discussion에서 힌트 얻음)

 

 

 

class Solution:
    def romanToInt(self, s: str) -> int:
        answer = 0
        dic = {
            'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
        }
        for i in range(len(s)-1):
            if dic[s[i]] < dic[s[i+1]]:
                answer -= dic[s[i]]
            else:
                answer += dic[s[i]]
        return answer+dic[s[-1]]

 

댓글