[리트코드] 13. Roman to Integer

Chaejung·2022년 8월 2일
0

알고리즘_JavaScript

목록 보기
1/12

문제

로마자숫자를 입력으로 받을 때, 이를 아라비아숫자로 출력하면 되는 간단한 문제이다.
하지만 로마자숫자에서는, 4가 'IIII'가 아니라 'IV'인 점을 유의해야한다.
즉, 단위 문자(V, X, L, C, D, M) 근처로 진입하면 형태가 바뀐다.

처음에는 단위 문자 근처에서 바뀌는 애들을 따로 만들어서 슬라이싱하여 판별하는 코드를 만들까했지만, 결과를 보고 어떤 규칙을 발견하니 굳이 번거롭게 하지 않아도 됐다.

세 번째 예시에서는 "MCMXCIV"가 주어져 있는데, 이를 각각의 아라비아숫자로 나타내면 다음과 같다.

1000 + 100 + 1000 + 10 + 100 + 1 + 5 != 1994

여기서 처음부터 탐색을 한다고 가정했을 때, 숫자가 점점 작아지는 것이 보통인데, 갑자기 이전 수보다 커져버리면 그때 아래처럼 연산을 바꿔주면 의미하는 수가 나온다.

1000 - ( 100 - 1000 ) - ( 10 - 100) - ( 1 - 5) == 1994
1000 - 100 + 1000 - 10 + 100 - 1 + 5 == 1994

즉 커져버린 순간의 이전 수의 부호를 -로 바꿔주면 된다.

해설 코드

/**
 * @param {string} s
 * @return {number}
 */

var romanToInt = function(s) {
  	// 모든 로마자를 해당하는 아라비아수로 바꿔주기
    let numberArr = []
    for (let i=0;i<s.length;i++){
        if (s[i] === 'I'){ numberArr.push(1)}
        else if (s[i]==='V'){numberArr.push(5)}
        else if (s[i]==='X'){numberArr.push(10)}
        else if (s[i]==='L'){numberArr.push(50)}
        else if (s[i]==='C'){numberArr.push(100)}
        else if (s[i]==='D'){numberArr.push(500)}
        else{numberArr.push(1000)}
    }
    // 아라비아수를 탐색하면서 작아지는 순간 연산 바꿔주기
    for (let i=0;i<numberArr.length-1;i++){
        if (numberArr[i]<numberArr[i+1]){
            numberArr[i] = -numberArr[i]
        }
    }
  	// 총합 구하기
    answer = 0
    for (let i=0;i<numberArr.length;i++){
        answer += numberArr[i]
    }
    return answer
};

결과

profile
프론트엔드 기술 학습 및 공유를 활발하게 하기 위해 노력합니다.

0개의 댓글