오늘은 일상에도 쓰일법한 로마 숫자 Integer로 변형하기 알고리즘에 대해 알아보도록 하겠습니다.
문제
로마 숫자가 주어졌을 때 Integer로 변경을 하는 문제입니다. 로마 숫자 테이블은 아래와 같습니다.
심볼 값
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
다만 예외가 몇 가지 있습니다. V의 경우 5를 리턴하면 되지만 IV의 경우 4를 리턴해야 하고 IX의 경우 9를 리턴해야 합니다. 또한 XL의 경우 40, XC의 경우 90이 리턴되는 등 앞 숫자가 뒤 숫자보다 작으면 뺄셈 역할을 하게 됩니다.
풀이
위의 설명 그대로 푸시면 됩니다. 각 심볼의 값을 테이블 형태로 메모리에 올려두시고 다음 인덱스의 심볼이 현재 인덱스의 심벌보다 값이 적을 때 현재 인덱스의 심볼 값을 총 값에서 빼주면 됩니다. Javascript의 reduce 함수를 사용해 풀어보도록 하겠습니다.
/**
* @param {string} s
* @return {number}
*/
const romanToInt = function (s) {
// 로마 숫자 테이블
const romanMap = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
};
const arr = s.split('');
return arr.reduce((acc, item, index) => {
// 현재 로마 숫자의 Integer 값
const curVal = romanMap[item];
// 다음 로마 숫자의 Integer 값
const nextVal = romanMap[arr[index + 1]];
// 다음값이 더 높을경우 현재값 뺄셈 아닐경우 덧셈
if (nextVal > curVal) {
acc -= curVal;
}else{
acc += curVal;
}
return acc;
}, 0);
};
아래 문제를 참고하였습니다.