[프로그래머스] 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어 (JavaScript)

구미·2021년 7월 31일
0

알고리즘

목록 보기
17/25

첫 풀이

function solution(s) {
    const englishNum = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];

    let answer = s;
    
    for (let i = 0; i < 10; i++) {
        answer = answer.replace(englishNum[i], i.toString());
    }
    
    return parseInt(answer);
}

테스트 케이스 3개를 통과하지 못하는 걸 보고 replace 함수 관련 놓치고 있는 게 있다는 생각이 들었다.

s = 'one1one4seven';
console.log(s.replace('one', 1));

// 실행 결과: '11one4seven'

예상했던대로 replace 함수는 문자열에서 처음으로 일치하는 부분만 교체해준다.
이를 고려해 전체 문자열에 더이상 문자가 없을 때까지 replace 해주는 작업을 반복하도록 코드를 수정해봤다.

+) 최근 ES2021부터 replaceAll() 함수를 사용할 수 있다고 들었다! 😮

s = 'one1one4seven';
console.log(s.replaceAll('one', 1));

// 실행 결과: '1114seven'

테스트해보니 매우 잘되지만 프로그래머스에 replaceAll()을 사용한 코드를 제출하려고 하면

TypeError [Error]: answer.replaceAll is not a function

이런 에러가 뜬다! 코테에서 사용하기에는 너무 이른 듯하다.

수정한 코드

function solution(s) {
    const englishNum = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
    let answer = s;

    while (Number.isInteger(s*1) === false) {
        for (let i = 0; i < 10; i++) {
            answer = answer.replace(englishNum[i], i);
        }
    }
    
    return answer*1;
}

응... 시간초과야...

쓰면서도 좋은 방법은 아니다 싶었는데 역시 ^^...

제출한 코드

function solution(s) {
  const len = s.length;

  const englishNum = {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9}

  let answer = '';
  let temp = '';

  for (let i = 0; i < len; i++) {
    if (Number.isInteger(s[i]*1)) {
      answer += s[i];
    } else {
      temp += s[i];
    }

    if (Number.isInteger(englishNum[temp])) {
      answer += englishNum[temp];
      temp = '';
    }
  }

  return answer*1;
}

영단어와 숫자를 이어둔 object와 영단어를 체크할 수 있는 배열을 이용해서 해결!

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/81301?language=javascript

profile
디지털 노마드를 꿈꾸며! 🦄 🌈

0개의 댓글