로마 숫자를 정수로 또는 그 반대로 변환

Creed Ferguson (Unsplash)의 표지 이미지

소개



이 게시물은 제가 LeetCode에서 해결한 두 가지 문제에서 영감을 받았습니다. 그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다.

LeetCode에서 문제 설명을 보려면 강조 표시된 제목을 클릭하십시오.

로마 숫자를 정수로



문자열이 주어지고 길이는 1에서 15까지입니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 [1, 3999] 범위의 유효한 로마 숫자임을 보장합니다. 따라서 작업은 로마 숫자를 나타내는 주어진 문자열을 해당 정수로 변환하는 것입니다. 또한 다음 진술을 고려하십시오.
  • IV (5)와 X (10) 앞에 배치되어 4와 9를 만들 수 있습니다.
  • XL (50)과 C (100) 앞에 배치되어 40과 90을 만들 수 있습니다.
  • CD (500) 및 M (1000) 앞에 배치되어 400 및 900을 만들 수 있습니다.

  • 솔루션 논의



    이 문제를 해결하기 위해 사용한 접근 방식은 문자열을 반복하고 문제 설명에서 위에서 설명한 빼기 원칙을 충족하는 조건을 실행하여 최종 합계에 해당하는 결과를 반환하는 것이었습니다.

    조건은 다음과 같습니다. 현재 문자가 이전 문자보다 크면 결과에서 이전 문자 값을 빼고, 그렇지 않으면 이전 문자 값을 결과로 증가시킵니다.

    예를 들어 문자열 s = 'XIV'를 고려하면 'X' 변수가 10로 초기화되기 때문에 값이 previousChar인 첫 번째 문자0가 조건을 충족하고 result는 여전히 0로 남아 있습니다. ) .
    값이 'I'인 두 번째 문자11가 현재 previousChar10보다 크지 않으면 조건을 충족하지 않습니다. 따라서 result10만큼 증가하고 previousChar1로 업데이트됩니다.
    마지막으로 값이 'V'인 세 번째 문자5previousChar보다 크기 때문에 조건을 충족합니다. 따라서 result에서 1를 빼고 previousChar를 5로 업데이트합니다.
    이 코드는 result = 9 로 루프를 끝내고 마지막으로 previousChar 의 값을 result 로 증가시킵니다. 따라서 최종 result14가 됩니다.

    해결책



    다음은 Python 솔루션의 예입니다.

    numbersDict = {
        'I': 1,
        'V': 5,
        'X': 10,
        'L': 50,
        'C': 100,
        'D': 500,
        'M': 1000
    }
    
    def romanToInt(s):
        result = 0
        previousChar = 0
    
        for char in s:
            if numbersDict[char] > previousChar:
                result -= previousChar
            else:
                result += previousChar
    
            previousChar = numbersDict[char]
    
        result += previousChar
        return result
    


    정수 대 로마 숫자


    1 <= num <= 3999 범위의 정수가 주어지고 이를 로마 숫자로 변환하는 작업입니다.

    솔루션 논의



    이전 문제의 솔루션에서와 같이 먼저 dictionary를 생성하여 정수와 각각의 로마 숫자를 매핑합니다. 그러나 단일 문자 로마 숫자만 매핑한 이전 챌린지와 달리 이 경우에는 정수 4와 9와 그 후속 40, 90, 400 및 900인 1000까지 매핑해야 합니다.

    필요한 검사를 실행할 때 각 반복과 관련이 있기 때문에 내림차순으로 튜플 배열을 주문한 이 경우에 대해 언급하는 것도 중요합니다.

    따라서 첫 번째 단계 후에 변환을 수행하는 함수를 만듭니다. 이 아이디어는 전체 문자열을 반복할 때까지 카운터에 값을 증가시키는 대신 주어진 숫자에서 값을 빼고 각각의 로마 숫자를 result라는 문자열 유형 변수에 연결한다는 점을 제외하면 이전 챌린지와 유사합니다. .

    해결책



    다음은 Python 솔루션의 예입니다.

    numbersDict = [
        (1000, 'M'),
        (900, 'CM'),
        (500, 'D'),
        (400, 'CD'),
        (100, 'C'),
        (90, 'XC'),
        (50, 'L'),
        (40, 'XL'),
        (10, 'X'),
        (9, 'IX'),
        (5, 'V'),
        (4, 'IV'),
        (1, 'I')
    ]
    
    def intToRoman(num):
        remaining = num
        result = ''
        for integerValue, romanNumeral in numbersDict:
            while remaining >= integerValue:
                result += romanNumeral
                remaining -= integerValue
        return result
    
    


    그런 다음 JavaScript의 동일한 솔루션:

    const numbersDict = [
        [1000, 'M'],
        [900, 'CM'],
        [500, 'D'],
        [400, 'CD'],
        [100, 'C'],
        [90, 'XC'],
        [50, 'L'],
        [40, 'XL'],
        [10, 'X'],
        [9, 'IX'],
        [5, 'V'],
        [4, 'IV'],
        [1, 'I']
    ];
    
    const intToRoman = (num) => {
        let remaining = num;
        let result = '';
    
        for (let [integerValue, romanNumeral] of numbersDict) {
            while (remaining >= integerValue) {
                result += romanNumeral;
                remaining -= integerValue;
            }
        }
        return result;
    };
    

    좋은 웹페이지 즐겨찾기