LeetCode/Easy

[LeetCode / JavaScript] - 13. Roman to Integer

LaKinRad 2022. 6. 22. 10:12

출처/LeetCode

● 문제 설명

로마 숫자는 7개의 기호로 표현됩니다. [ I, V, X, L, C, D 그리고 M ]

symbol value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

예를 들어, 2 는 로마 숫자 II 로 표기되며, 2 개만 더하면 됩니다. 12X + IIXII 로 작성합니다. 27XX + V + IIXXVII 로 작성합니다.

로마 숫자는 대개 왼쪽부터 오른쪽으로 큰 것부터 작은 것으로 작성합니다. 그러나, 4는 IIII 가 아닙니다.
대신, IV로 작성합니다. 1이 5보다 잎에 있기 때문에 빼서 4를 만듭니다. IX 로 작성된 9도 동일한 원칙이 적용됩니다. 
빼기가 사용되는 6가지 경우가 있습니다.

- I 는 V(5) 와  X(10) 앞에 배치하여 4와 9를 만들 수 있습니다.
- X 는 L(50) 과 C(100) 앞에 배치하여 40과 90을 만들 수 있습니다.
- C 는 D(500) 와 M(1000) 앞에 배치하여 400과 900을 만들 수 있습니다.

 

● 입출력 예

 


나의 풀이

 

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(s) {
    return s.split("").reduce(function(acc, v, i){
        if(v == "I"){
            if(s[i+1] == "V" || s[i+1] == "X"){
                acc -= 1;
            } else {
                acc += 1;   
            }
        } else if(v == "V"){
            acc += 5;
        } else if(v == "X"){
            if(s[i+1] == "L" || s[i+1] == "C"){
                acc -= 10;
            } else {
                acc += 10;   
            }
        } else if(v == "L"){
            acc += 50;
        } else if(v == "C"){
            if(s[i+1] == "D" || s[i+1] == "M"){
                acc -= 100;
            } else {
                acc += 100;   
            }
        } else if(v == "D"){
            acc += 500;
        } else if(v == "M"){
            acc += 1000;
        }
        return acc;
    }, 0);
};

 

들어온 로마 숫자를 배열로 만들고, reduce() 를 통해 숫자로 만들어 반환하였다.

그리고 7개의 기호마다 분기를 태우고, 빼기가 사용되는 예외 조건들은 한 번 더 if문으로 묶었다.

 


후기

 

Runtime이 빠른 코드를 보던 중 이런 코드를 발견했다.

 

/**
 * @param {string} s
 * @return {number}
 */
var romanToInt = function(string) {

  const nums = {
    "I": 1,
    "V": 5,
    "X": 10,
    "L": 50,
    "C": 100,
    "D": 500,
    "M": 1000
  }

  let acc = 0;

  for (let i = 0; i < string.length ; i += 1) {
    if (nums[string[i]] < nums[string[i + 1]]) {
      acc -= nums[string[i]];
    } else {
      acc += nums[string[i]];
    }
  }
  return acc;
};

 

이 코드가 내가 원했던 '로마 숫자는 큰 것부터 작은 것으로 작성한다.' 라는 조건을 잘 활용한 코드이고, 최종적으로 이런 코드를 짜고 싶었던 건데, 깊이 생각해 보지 못해서 하나씩 다 분기를 처리해 주어서 아쉬움이 남았던 문제인 것 같다.