Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 로마 숫자를 정수로 변환하는 방법

로마자 표기된 문자열이 주어졌을 때, 이를 정수로 변환하는 문제를 살펴보겠습니다. 로마 숫자는 아래와 같은 기호들로 표현됩니다.

기호
I1
V5
X10
L50
C100
D500
M1000

로마 숫자의 규칙

로마 숫자의 구조를 자세히 보면 그 규칙을 이해할 수 있습니다. 예를 들어 '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 등)을 우선적으로 검사하기 때문에 감산 규칙도 자연스럽게 처리됩니다.