로마 숫자는 아래와 같이 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문으로 순회한다.
// 보통 로마 숫자는 오른쪽으로 갈수록 작아지는데 현재 로마 숫자가 다음의 로마 숫자보다 작을 경우, 뺄셈을 수행하고 클 경우, 덧셈을 수행한다.