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 개만 더하면 됩니다. 12 는 X + II 인 XII 로 작성합니다. 27 은 XX + V + II 인 XXVII 로 작성합니다.
로마 숫자는 대개 왼쪽부터 오른쪽으로 큰 것부터 작은 것으로 작성합니다. 그러나, 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;
};
이 코드가 내가 원했던 '로마 숫자는 큰 것부터 작은 것으로 작성한다.' 라는 조건을 잘 활용한 코드이고, 최종적으로 이런 코드를 짜고 싶었던 건데, 깊이 생각해 보지 못해서 하나씩 다 분기를 처리해 주어서 아쉬움이 남았던 문제인 것 같다.