[TIL #18 WECODE] Code Kata

Whoyoung90·2021년 3월 8일
0
post-thumbnail

210308 WECODE #18 Code Kata

문제

로마자에서 숫자로 바꾸기

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입니다.

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

나의 답변

<script>
function romanToNum(s){
  let romaChange = {
      I: 1,
      V: 5,
      X: 10,
      L: 50,
      C: 100,
      D: 500,
      M: 1000
  }
  let strArr = s.split('');
  // ['M', 'C', 'D', 'X', 'C', 'I', 'V' ]
  let numArr = strArr.map(e => romaChange[e]);
  // [ 1000, 100, 500, 10, 100, 1, 5 ]
  let sum = 0;

  for(let i=0; i<numArr.length; i++){
    if(numArr[i]<numArr[i+1]){
      sum = sum + numArr[i+1]-numArr[i]; //i=1 3 5
      i = i + 1;
    }
    else {
      sum = sum + numArr[i] //i=0
    }
  } return sum;
}
romanToNum('MCDXCIV'); //1494
</script>
  • romaChange라는 객체를 선언하고 그 안에다 모든 로마자 표기를 적어주었다.
  • 로마자 예시로 MCDXCI를 split함수를 사용하여 하나씩 배열로 쪼갠뒤
  • 쪼갠 로마자들을 map함수를 활용하여 value값을 가진 새로운 배열로 리턴하였다!!!(romaChange[e] =객체[key] = value)
  • 자릿수의 합을 구해야하니 일단 sum=0을 선언하였고
  • [ 1000, 100, 500, 10, 100, 1, 5 ]에 for문을 돌리는데
  • 이 문제의 포인트는 4와 9가 문제이다. IV와 IX로 표현되기 때문이다.
  • 배열에서 M=1000, CD=100 500으로 400, XC=10 100으로 90 IV=1 5로 4 이렇게 For문의 [i]값에서 조정을 해주어야 한다고 생각하였다.
  • 결국 numArr[i]<numArr[i+1]일때 numArr[i+1]-numArr[i]처럼 뒤에서 빼주어야 해당값이 나온다(IV IX)
  • for문을 순서대로 다돌리면 모든 값이 다 더해지는 오류가 발생하는데
  • i=0; 1000 (O)
    i=1; 400 (O)
    i=2; 500 (X)
    i=3; 90 (O)
    i=4; 100 (X)
    i=5; 4 (O)
  • 앞 조건문에서 i=1 3 5, else 에서 i=0만 적용하면 된다. 결국 i=2 4는 버리는 i값이라는 것!!!
  • 그래서 앞조건문에서 i = i + 1;을 추가해주면 2, 4값을 버리고 추출할 수 있다. 선택적 추출이랄까...?
profile
비전공으로 일식 쉐프가 되었듯, 배움에 겸손한 프론트엔드 개발자가 되겠습니다 :)

0개의 댓글