로마자 표기된 문자열이 주어졌을 때, 이를 정수로 변환하는 문제를 살펴보겠습니다. 로마 숫자는 아래와 같은 기호들로 표현됩니다.
| 기호 | 값 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
로마 숫자의 규칙
로마 숫자의 구조를 자세히 보면 그 규칙을 이해할 수 있습니다. 예를 들어 'II'는 'I' 두 개가 더해진 값이므로 2입니다. 'XII'는 X + II = 10 + 2 = 12가 됩니다.
하지만 주의할 점이 있습니다. 4는 'IIII'가 아니라 'IV'로 표기됩니다. 이것이 바로 로마 숫자에서 까다로운 부분입니다.
- I는 V(5)나 X(10) 앞에 위치하여 각각 4와 9를 나타냅니다.
- X는 L(50)이나 C(100) 앞에 위치하여 각각 40과 90을 나타냅니다.
- C는 D(500)나 M(1000) 앞에 위치하여 각각 400과 900을 나타냅니다.
문제 해결 접근 방식
이번 글에서는 1부터 3999까지의 숫자를 변환할 수 있는 로마자-정수 변환기를 만들어 보겠습니다.
해결 방법은 다음과 같습니다. 먼저 기본 기호들의 값과 함께 4, 9, 40, 90, 400, 900 같은 특수한 값들을 사전(dictionary)에 저장합니다. 그 다음 입력 문자열을 처음부터 스캔하면서, 현재 위치에서 두 글자가 사전에 존재하면 해당 값을 결과에 더하고 인덱스를 2만큼 전진합니다. 존재하지 않으면 한 글자의 값을 더하고 인덱스를 1만큼 전진합니다. 이 과정을 문자열 끝까지 반복하면 최종적인 정수 값이 완성됩니다.
Python 구현 예제
class Solution(object):
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
roman = {'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}
i = 0
num = 0
while i < len(s):
if i+1<len(s) and s[i:i+2] in roman:
num+=roman[s[i:i+2]]
i+=2
else:
num+=roman[s[i]]
i+=1
return num
ob1 = Solution()
print(ob1.romanToInt("III"))
print(ob1.romanToInt("CDXLIII"))입력
"III" "CDXLIII"
출력
3 443
위 코드에서 'III'는 세 개의 I가 모두 개별적으로 처리되어 3이 되고, 'CDXLIII'는 CD(400) + XL(40) + III(3) = 443으로 올바르게 계산되는 것을 확인할 수 있습니다. 두 글자 조합(IV, IX, XL 등)을 우선적으로 검사하기 때문에 감산 규칙도 자연스럽게 처리됩니다.