LeetCode - 13. Roman to Integer

henu·2023년 8월 17일
0

LeetCode

목록 보기
3/186
post-thumbnail

Problem

로마 숫자는 아래와 같이 7종류의 기호로 나타낸다.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

예를 들어 2는 II, 12는 XII, 27은 XXVII로 나타낸다.
로마 숫자는 보통 왼쪽에서 오른쪽으로 갈수록 작아지도록 적는다. 하지만 4는 IIII가 아니다. IV로 적는다. V앞에 I은 뺄셈이다. 같은 원칙이 9에도 적용된다. 9는 IX이다.
아래와 같이 뺄셈이 사용되는 6가지 사례가 있다.

  • 4와 9를 만들기 위해 IVX 앞에 놓일 수 있다.
  • 40과 90을 만들기 위해 XLC 앞에 놓일 수 있다.
  • 400과 900을 만들기 위해 CDM 앞에 놓일 수 있다.

로마 숫자를 정수로 전환하라.

Example 1

Input: s = "III"
Output: 3
Explanation: III = 3.

Example 2

Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

Example 3

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

Solution

var romanToInt = function(s) {
    return [...s].reduce((acc, cur, idx, arr) => {
        if(cur === 'I') {
            if(arr[idx+1] === 'V' || arr[idx+1] === 'X') {
                return acc - 1;
            }
            return acc + 1;
        }
        if(cur === 'V') {
            return acc + 5;
        }
        if(cur === 'X') {
            if(arr[idx+1] === 'L' || arr[idx+1] === 'C') {
                return acc - 10;
            }
            return acc + 10;
        }
        if(cur === 'L') {
            return acc + 50;
        }
        if(cur === 'C') {
            if(arr[idx+1] === 'D' || arr[idx+1] === 'M') {
                return acc - 100;
            }
            return acc + 100;
        }
        if(cur === 'D') {
            return acc + 500;
        }
        if(cur === 'M') {
            return acc + 1000;
        }
    }, 0)  
};

Explanation

일단 string타입인 s를 배열로 전환한다. 배열을 하나의 number타입 값으로 변환하는 것이어서 reduce 메소드를 사용하였다.
그리고 각각의 로마 숫자마다 처리가 다르기 때문에 if문으로 분기하였다.
여기서 주의할 점은 IXC의 경우 뒤에 어떤 로마 숫자가 오는지에 따라 뺄셈으로 사용되기에 이 상황을 걸러서 처리해주어야한다.

Other

const symbols = { // 로마 숫자와 해당하는 정수를 1:1로 매핑한 객체를 만든다.
    "I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000
};

var romanToInt = function(s) {
    value = 0;
    for(let i = 0; i < s.length; i+=1){
        symbols[s[i]] < symbols[s[i+1]] ? value -= symbols[s[i]]: value += symbols[s[i]]
    }
    return value
};

// s를 배열로 전환하지 않고 자체를 for문으로 순회한다.
// 보통 로마 숫자는 오른쪽으로 갈수록 작아지는데 현재 로마 숫자가 다음의 로마 숫자보다 작을 경우, 뺄셈을 수행하고 클 경우, 덧셈을 수행한다.

0개의 댓글