[Code Kata] Week2 - Day 1

오지수·2021년 6월 28일
0

CodeKata

목록 보기
4/7
post-thumbnail

새로운 날이 밝았다! 2주차를 맞아 코드카타 짝을 바꾸고 다시 새로운 마음으로 새로 짝이 된 동기분과 1일차 코드 카타를 진행해보았다.

문제

로마자에서 숫자로 바꾸기

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

# Code
### 1st code
```javascript
// 로마자 -> 숫자
const roman = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000
  }

function romanToNum(s) {

  let result = 0;
  const arr = s.split('');
  const keys = Object.keys(roman); // 객체의 키
  const values = Object.values(roman); // 객체의 값

  // s를 split한 배열의 값이 키의 value와 일치할 때 해당 values[i]의 값으로 로마자를 숫자로 변환시킨다.
  const changeNum = arr.map((el) => {
    for (let i in keys) {
      if (el === keys[i]) {
        return values[i]
      }
    }
  });

  // 배열 안의 요소 중 이전 요소보다 다음 요소가 더 크다면 result -= changeNum[i] 크지 않다면 result += changeNum[i]
  for (let i = 0; i < changeNum.length; i++) {
    if (changeNum[i] < changeNum[i+1]) {
     result -= changeNum[i];
    } else {
     result += changeNum[i];
    }
  }
  
  return result;
}

2st code

[ 열음님 코드를 참고하여 수정하였음 ]

const roman = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000
  }

function romanToNum(s) {
  let result = 0;
  
  const changeNum = s.split('').map((el) => roman[el]);
 
  for (let i = 0; i < changeNum.length; i++) {
    if (changeNum[i] < changeNum[i+1]) {
     result -= changeNum[i];
    } else {
     result += changeNum[i];
    }
  }
  
  return result;
}
  • 로마자 s를 배열로 만든 값을 map을 통해 숫자로 변환된 배열로 만들 때, for과 key값 if문을 써서 복잡하게 만들지 않고도 roman[el] 으로 작성하면 roman 객체의 키 값에 해당하는 값으로 로마자를 숫자로 변환한 배열을 만들 수 있다.
profile
My Moto:: 내 스스로와 더불어 주변에게도 좋은 영향을 행사하도록 점검 & 노력..!!

0개의 댓글