TIL _ Code Kata _ 로마숫자를 아라비아 숫자로 바꾸기

❓문제

  • 1 ~ 3,999 사이의 로마숫자를 인자로 받았을 때, 이를 아라비아 숫자로 바꾸는 로직을 구현
  • 로마자는 각각 아래와 같이 대응하며,
Symbol        Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1,000

일반적인 로마숫자 변환 방식을 따릅니다. (ex. XXVII = 27, CDLIX = 459)

function romanToNum (s) { };


1. 해결 방안

  • 사고 과정

🔓 (문제 파악) 주어진 Symbol과 Value를 함수 인자와 비교할 수 있어야 한다.
🔑 (해결 방안) Symbol(key)과 Value(value)로 이루어진 프로퍼티를 담은 객체를 선언한다.

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




🔓 (문제 파악) 로마숫자를 아라비아 숫자로 바꿀 때의 규칙성 또는 공식을 파악한다.
🔑 (해결 방안)

  • 예를 들어,
    • 숫자 4를 표현할 때에는 V 왼쪽에 I가 붙는다.
    • 숫자 6을 표현할 때에는 V 오른쪽에 I가 붙는다.
    • 숫자 40를 표현할 때에는 L 왼쪽에 X가 붙는다.
    • 숫자 60을 표현할 때에는 L 오른쪽에 X가 붙는다.
    • 숫자 400를 표현할 때에는 D 왼쪽에 C가 붙는다.
    • 숫자 600을 표현할 때에는 D 오른쪽에 C가 붙는다.
      ...
      → 이어지는 로마숫자의 단위가 왼쪽 자리의 단위보다 클 경우, 왼쪽 자리의 로마숫자는 뺄셈이 된다.
      → 이어지는 로마숫자의 단위가 왼쪽 자리의 단위보다 작을 경우, 왼쪽 자리의 로마숫자는 덧셈이 된다.





🔓 (문제 파악) 파악한 규칙성을 바탕으로 주어진 로마숫자를 변환한다.
🔑 (해결 방안)

function romanToNum(s) {
  const roman = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000,
  };
  
  let result = 0; 
  
  for (i=0; i < s.length; i++) {
    roman[s[i]] < roman [s[i+1]]
      ? result -= roman[s[i]]
      : result += roman[s[i]];
  };
  // 연속되는 두 로마숫자의 단위를 비교하며, 조건에 따라 덧셈과 뺄셈을 argument의 길이만큼 반복한다.
  
  return result;
}



2. 결과


function romanToNum(s) {
  const roman = {
    I: 1,
    V: 5,
    X: 10,
    L: 50,
    C: 100,
    D: 500,
    M: 1000,
  };
  
  let result = 0; 
  
  for (i=0; i < s.length; i++) {
    roman[s[i]] < roman [s[i+1]]
      ? result -= roman[s[i]]
      : result += roman[s[i]];
  };
 
  return result;
}

console.log(romanToNum('XXVII')); // 27
console.log(romanToNum('CDLIX')); // 459



"작성 내용 중 오류나 오타가 있다면, 댓글로 알려주시면 감사하겠습니다. 주니어 개발자에게 남겨주시는 작은 피드백이 큰 도움이 될 것 같습니다. 고맙습니다 :)"

좋은 웹페이지 즐겨찾기