codekata - 로마자 비교하기

이후경·2022년 6월 13일
0

로마자에서 숫자로 바꾸기

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

처음에 어떻게 풀어야할지 아예 감이 잡히지 않았는데 힌트는 앞에 숫자를 빼준다는 내용이었다.
배열로 받아서 해당 배열과 그 다음 배열을 비교해서
만약에 작다면 (el < ar[idx + 1]) result -= el 빼주고 아니라면 더해준다.

function romanToNum(s) {
  // 여기에 코드를 작성해주세요.
  let result = 0;
  const roman =
    { 'I' : 1,
  'V' : 5,
  'X' : 10,
  'L' : 50,
  'C' : 100,
  'D' : 500,
  'M' : 1000
}
const stringArray = s
  .split('') // ['X','X','V','I','I']
  .map(a => roman[a]) // 숫자를 배열로 반환함 // 키값을 모를때, 가져오는 방식 대괄호 // [10,10,5,1,1]
  .map((el, idx, ar) => {  // 마지막 인자값은 배열을 통째로 사용한다.
  if (el < ar[idx + 1]) { // 현재 el과 그 다음 el을 비교한다. 여기서 ar은 전체 배열이며, 얘는 통 배열이므로 변한다거나 하지 않는다.
    result -= el 
  } else {
    result += el
  }
})
return result;
}
console.log(romanToNum('XXVII'))
module.exports = { romanToNum };
// MM / CM / LXXX / VII
// 2000+900+80+7
// [“M”, “M”, “C”, “M”, “L”, “X”, “X”, “X”, “V”,“I”, “I”]
// 1000, 1000, 100, 1000, 50, 10, 10, 10,   5,   1,   1
// 450 = CDL
// C D L
// 100 500 50
profile
나는야 경바

0개의 댓글