CodeKata. 로마자 숫자로 변환

ha ju·2021년 5월 3일
0

CodeKata.

🧐 문제


로마자에서 숫자로 바꾸기

1~3999 사이의 로마자 s를 인자로 주면 그에 해당하는 숫자를 반환해주세요. 로마 숫자를 숫자로 표기하면 다음과 같습니다.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
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입니다.

I는 V와 X앞에 와서 4, 9 X는 L, C앞에 와서 40, 90 C는 D, M앞에 와서 400, 900

🧐 나의 코드

const s = "MCDIX";
function romanToNum(s) {
   const Roma = {
I   :    1,
V   :   5,
X   :   10,
L   :    50,
C    :   100,
D    :   500,
M    :   1000,
}
  const romArr= s.split('');
  const numArr = romArr.map(el => Roma[el]);
  let sum=0;
  for(let i=0 ;i < numArr.length ;i++) {
    if(numArr[i] < numArr[i+1]) {
      sum = sum-numArr[i];
    } else {
      sum = sum + numArr[i];
    }  ;
  }
  return sum;
}

💡 접근 방법

로마자 String을 각각 배열로 쪼개고 map함수를 써서 숫자로 치환한 뒤 조건에 따라 숫자들을 차례로 더해주었다.
1) 문자를 배열로 나누어주고

  const romArr= s.split('');
  console.log(romArr);          // [ 'M', 'C', 'D', 'I', 'X' ]

2) map함수를 사용하여 배열 내 문자들을 모두 앞서 정의해준 숫자로 치환하였다.

  const numArr = romArr.map(el => Roma[el]);  //Roma라는 객체에서 el 이라는 key값에 접근
  console.log(numArr);                       //[ 1000, 100, 500, 1, 10 ]

3) 이제 배열 내 데이터를 각 숫자들을 더하거나 빼줘야 하는데
- 일단, sum이라는 변수를 0으로 정의하고
- for문을 사용해서 numArr배열의 앞뒤값을 각각 비교한뒤 (index 0,1값 비교 / index 1,2값 비교...)
- 뒷자리가 클 경우 sum에 앞 자리를 빼주고 뒷자리가 작거나 같을 경우는 sum에 앞자리수를 더해주는 것으로 접근했다.

  let sum=0;
  for(let i=0 ;i < numArr.length ;i++) {
    if(numArr[i] < numArr[i+1]) {
      sum = sum-numArr[i];
    } else {
      sum = sum + numArr[i];
    }  ;
  }

0개의 댓글