
로마 숫자는 아래와 같이 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가지 사례가 있다.
I가 V와 X 앞에 놓일 수 있다.X가 L와 C 앞에 놓일 수 있다. C가 D와 M 앞에 놓일 수 있다.로마 숫자를 정수로 전환하라.
Input: s = "III"
Output: 3
Explanation: III = 3.
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
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)
};
일단
string타입인s를 배열로 전환한다. 배열을 하나의number타입 값으로 변환하는 것이어서reduce메소드를 사용하였다.
그리고 각각의 로마 숫자마다 처리가 다르기 때문에if문으로 분기하였다.
여기서 주의할 점은I와X와C의 경우 뒤에 어떤 로마 숫자가 오는지에 따라 뺄셈으로 사용되기에 이 상황을 걸러서 처리해주어야한다.
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문으로 순회한다.
// 보통 로마 숫자는 오른쪽으로 갈수록 작아지는데 현재 로마 숫자가 다음의 로마 숫자보다 작을 경우, 뺄셈을 수행하고 클 경우, 덧셈을 수행한다.