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]]
댓글