Roman to Integer

멈춰있지 않기 위해서·2023년 3월 23일
0

알고리즘

목록 보기
2/2

로마 숫자를 정수로 변환하는 함수를 작성해야 하는 문제입니다.
로마 숫자를 읽을줄 알아야 하는데 저도 이문제를 풀이하며 처음으로 알게된 사실이 있습니다. 1이 I, 2가 II, 3이 III
인것 까지는 알고 있는데 4가 IIII가 아니고 IV인 사실에 대해서는 깊게 생각해본 적이 없었습니다.
I만 반복적으로 나타낼 수 없으니 IV를 4로 정했나 보다 정도로만 생각했습니다.
하지만 사실은 V가 5이고 I는 1이어서 IV는 뒤에 배치된 로마숫자에서 앞에 존재하는 로마 숫자를 빼서 표현한다는 규칙이 존재했습니다.
C가 100이고 X가 10을 표현한다면 XC는 뭘까요 맞습니다 90입니다.

아래는 제가 풀이한 방법입니다.

const romanToInt = (string) => {
//symbols 객체를 생성하여 로마숫자와 그에 해당하는 숫자를 매핑 시켜주었습니다.
  const symbols = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000,
  };
// answer라는 변수를 초기화하여 결과 값을 저장할 공간 마련
  let answer = 0;

// 문자열 string을 순회하면서 현재 문자 값이 다음 문자 값보다 작으면 현재 문자에 해당하는 값을 answer에서 빼주고
그렇지 않다면 더해주는 방법으로 풀이하였습니다.
  for (let i = 0; i < string.length; i ++) {
    symbols[string[i]] < symbols[string[i + 1]]
      ? (answer -= symbols[string[i]])
      : (answer += symbols[string[i]]);
  }

  return answer;
};


리팩토링: 변수명과 문자값을 더 명시적으로 리팩토링 해보았습니다.

function romanToInt(s) {
  const romanToValue = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000,
  };

  let total = 0;

  for (let i = 0; i < s.length; i++) {
    const current = romanToValue[s[i]];
    const next = romanToValue[s[i + 1]];

    if (current < next) {
      total -= current;
    } else {
      total += current;
    }
  }

  return total;
}
profile
멈춰있지 않기 위한 나만의 블로그

0개의 댓글