[Algorithm] [초급] 로마 숫자 Integer 로 변형하기

오늘은 일상에도 쓰일법한 로마 숫자 Integer로 변형하기 알고리즘에 대해 알아보도록 하겠습니다.

문제

로마 숫자가 주어졌을 때 Integer로 변경을 하는 문제입니다. 로마 숫자 테이블은 아래와 같습니다.

심볼           값
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

다만 예외가 몇 가지 있습니다. V의 경우 5를 리턴하면 되지만 IV의 경우 4를 리턴해야 하고 IX의 경우 9를 리턴해야 합니다. 또한 XL의 경우 40, XC의 경우 90이 리턴되는 등 앞 숫자가 뒤 숫자보다 작으면 뺄셈 역할을 하게 됩니다.

풀이

위의 설명 그대로 푸시면 됩니다. 각 심볼의 값을 테이블 형태로 메모리에 올려두시고 다음 인덱스의 심볼이 현재 인덱스의 심벌보다 값이 적을 때 현재 인덱스의 심볼 값을 총 값에서 빼주면 됩니다. Javascript의 reduce 함수를 사용해 풀어보도록 하겠습니다.

/**
 * @param {string} s
 * @return {number}
 */
const romanToInt = function (s) {
    // 로마 숫자 테이블
    const romanMap = {
        I: 1,
        V: 5,
        X: 10,
        L: 50,
        C: 100,
        D: 500,
        M: 1000
    };

    const arr = s.split('');

    return arr.reduce((acc, item, index) => {
        // 현재 로마 숫자의 Integer 값
        const curVal = romanMap[item];
        // 다음 로마 숫자의 Integer 값
        const nextVal = romanMap[arr[index + 1]];

        // 다음값이 더 높을경우 현재값 뺄셈 아닐경우 덧셈
        if (nextVal > curVal) {
            acc -= curVal;
        }else{
            acc += curVal;
        }

        return acc;

    }, 0);
};

아래 문제를 참고하였습니다.

LeetCode

©Code Factory All Rights Reserved