글 작성자: 개발자 올라프

문제

 

로마자에서 숫자로 바꾸기

 

1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환한다. 로마 숫자를 표기하면 아래와 같다.

Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
  • 로마 숫자를 읽는 방법은 로마자를 왼쪽부터 차례로 더하면 된다. III=3, XII=12, XXVII=27
  • 그런데 4를 표현할 때는 IIII가 아닌, IV로 뒤의 숫자에서 앞의 숫자를 뺀다. 9의 경우는 IX로 표현한다.
  • IV=4, IX=9, XL=40, XC=90, CD=400, CM=900

 


 

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

const romanToNum = (romanNum) => {
	const romanArr = romanNum.split(""); // 배열로 전환
    const numArr = romanArr.map(e => roman[e]); // 숫자로 전환
    let sumArr = 0; // 합계 저장할 변수 선언
    
    for(let i=0; i<numArr.length; i++) {
    	if(numArr[i] < numArr[i+1]) {
        	sumArr += (numArr[i+1] - numArr[i]);
            i++
        } else {
        	sumArr += numArr[i];
        }
    }
  	return sumArr;
}

 

로마자는 왼쪽부터 차례대로 더한 값이 나온다. 만약 좌측값이 우측값보다 더 작은 경우(ex. IV, IX 등)에만 우측에서 좌측값을 뺀 결과가 나온다. 이러한 결과까지 도달하기는 쉬웠으나 로마 숫자를 어떻게 숫자로 변환시킬지 생각하는데 시간이 오래 걸렸다. 로마 숫자를 객체로 선언하고 map()을 사용해서 쉽게 변환할 수 있었다.