[프로그래머스] 영어가 싫어요


문제 설명

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers 를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.


제한사항

  • numbers는 소문자로만 구성되어 있습니다.
  • numbers는 “zero”, “one”, “two”, “three”, “four”, “five”, “six”, “seven”, “eight”, “nine” 들이 공백 없이 조합되어 있습니다.
  • 1 ≤ numbers의 길이 ≤ 50
  • “zero”는 numbers의 맨 앞에 올 수 없습니다.

입출력 예

numbersresult
“onetwothreefourfivesixseveneightnine”123456789
“onefourzerosixseven”14067

입출력 예 설명

입출력 예 #1

  • “onetwothreefourfivesixseveneightnine”를 숫자로 바꾼 123456789를 return합니다.

입출력 예 #1

  • “onefourzerosixseven”를 숫자로 바꾼 14067를 return합니다.

나의 풀이

const EnToNumbers = [
  "zero",
  "one",
  "two",
  "three",
  "four",
  "five",
  "six",
  "seven",
  "eight",
  "nine",
];

function solution(numbers) {
  EnToNumbers.forEach((item, idx) => {
    numbers = numbers.split(item).join(idx);
  });
  return Number(numbers);
}

나의 두번째 풀이(Code Refactoring)

function solution(numbers) {
  let eng = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];
  for (i = 0; i < eng.length; i++) {
    numbers = numbers.split(eng[i]).join(i);
  }
  return Number(numbers);
}
// 1. eng값의 인덱스값 체크해서 numbers의 반환값을 숫자로 리턴

참고 할 만한 다른 사람의 코드

function solution(numbers) {
  const obj = {
    zero: 0,
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
    six: 6,
    seven: 7,
    eight: 8,
    nine: 9,
  };

  const num = numbers.replace(
    /zero|one|two|three|four|five|six|seven|eight|nine/g,
    (v) => {
      return obj[v];
    }
  );

  return Number(num);
}

// replace를 이용한 콜백함수를 활용