decodeRomanNumerals.js

Codewars 알고리즘 풀이


Problem

  • Create a function that takes a Roman numeral as its argument and returns its value as a numeric decimal integer.
    • 로마 숫자(Roman numeral)를 10진수로 반환한다.


For example:

1990 => MCMXC

1000: M

900: CM

90: XC



Solution 01

function decodeRomanNumerals(roman) {
  const rom = { M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };
  let arr = roman.split('');
  let result = 0;
  
  for (let i = 0; i < arr.length; i++) {
    if (rom[arr[i]] < rom[arr[i + 1]]) {
      result += rom[arr[i + 1]] - rom[arr[i]];
      i++;
    } else {
      result += rom[arr[i]];
    }
  }
  return result;
}

decodeRomanNumerals('I');      // 1
decodeRomanNumerals('II');     // 2
decodeRomanNumerals('III');    // 3
decodeRomanNumerals('IV');     // 4
decodeRomanNumerals('V');      // 5
decodeRomanNumerals('VI');     // 6
decodeRomanNumerals('VII');    // 7
decodeRomanNumerals('VIII');   // 8
decodeRomanNumerals('IX');     // 9
decodeRomanNumerals('X');      // 10
decodeRomanNumerals('XI');     // 11
decodeRomanNumerals('XII');    // 12
decodeRomanNumerals('MCMXC');  // 1990


Solution 02

function decodeRomanNumerals(roman) {
  const rom = { M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };
  
  return roman.split('').map(i => rom[i]).reduce((result, i, index, array) => {
    if (i < array[index + 1]) {
      return result - i;
    }
    return result + i;
  }, 0);
}

decodeRomanNumerals('I');      // 1
decodeRomanNumerals('II');     // 2
decodeRomanNumerals('III');    // 3
decodeRomanNumerals('IV');     // 4
decodeRomanNumerals('V');      // 5
decodeRomanNumerals('VI');     // 6
decodeRomanNumerals('VII');    // 7
decodeRomanNumerals('VIII');   // 8
decodeRomanNumerals('IX');     // 9
decodeRomanNumerals('X');      // 10
decodeRomanNumerals('XI');     // 11
decodeRomanNumerals('XII');    // 12
decodeRomanNumerals('MCMXC');  // 1990


Solution 03

function decodeRomanNumerals(roman) {
  const rom = { M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1 };
  
  return roman.split('').map(i => rom[i]).reduce((result, i, index, array) => result + (i < array[index + 1] ? -i : i), 0);
}

decodeRomanNumerals('I');      // 1
decodeRomanNumerals('II');     // 2
decodeRomanNumerals('III');    // 3
decodeRomanNumerals('IV');     // 4
decodeRomanNumerals('V');      // 5
decodeRomanNumerals('VI');     // 6
decodeRomanNumerals('VII');    // 7
decodeRomanNumerals('VIII');   // 8
decodeRomanNumerals('IX');     // 9
decodeRomanNumerals('X');      // 10
decodeRomanNumerals('XI');     // 11
decodeRomanNumerals('XII');    // 12
decodeRomanNumerals('MCMXC');  // 1990