프로그래머스 - 숫자 문자열과 영단어

Kyle·2022년 9월 11일
0

Algorithm

목록 보기
3/4

https://school.programmers.co.kr/learn/courses/30/lessons/81301

2021 카카오 채용연계형 인턴십 문제라길래 도움 없이 풀어보고 싶어 계속 잡고 있었던 문제이다.

숫자가 0부터 시작한다는 점에서 인덱스를 착안하였다. s의 문자열을 하나씩 임의의 문자열(tempAnswer)에 담아서 미리 만들어 놓은 인덱스의 원소들과 비교를 생각했다. 숫자는 값을 그대로 받고 문자열은 인덱스의 원소들과 같아진다면 배열(tempArr)에 따로 담아두고 기존의 tempArr을 초기화해서 반복해보자.

function solution(s) {
  let answer = "";
  let tempArr = [];
  let tempAnswer = "";
  const arr = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine"
  ];
  for (let i = 0; i < s.length; i++) { // 해당 for문을 통해 s문자열 하나하나씩을 검증한다.
    if (s[i] >= 0 && s[i] <= 9) { // 만약 숫자라면 number 타입으로 변환한다. else문에서 사용한 indexOf()가
                                     반환하는 타입이 number이기 때문에 number로 맞춰준 것이다.
      tempArr.push(Number(s[i]));
    } else {
      tempAnswer += s[i]; // tempArr에 s[i]를 하나씩 차곡차곡 쌓다가 단어 하나를 이루게 된다면 if문이 실행된다.
      if (arr.includes(tempAnswer)) {
        tempArr.push(arr.indexOf(tempAnswer)); //숫자가 0부터 시작하기 때문에 indexOf로 값을 넘겨주면 단어에 맞는
                                                 숫자가 나오게 된다.
        tempAnswer = [];  // 새로운 배열에 단어를 쌓아야하기 때문에 비워준다.
      }
    }
  }
  for (let i = 0; i < tempArr.length; i++) { // 배열을 문자열로 만드는 과정이다.
    answer += tempArr[i];
  }
  return Number(answer);
}

for문 방향을 잘못 잡게 된다면 "1zerotwozero3" 같은 테스트케이스에서 에러가 난다.
zero, two를 한 후 인덱스 값은 계속 커지기 때문에 두번째 zero를 잡지 못하는 경우가 생기기 때문이다.

시간이 걸렸긴 했지만 풀이를 보지 않고 결국 풀어내어 뿌듯한 경험이었다.

아차모먼트

문제를 풀면서 indexOf()의 사용에 대해 조금 더 친숙해지고 for문에 대해서도 조금 더 신중히 사용해야겠다고 생각하게 된 문제였다.

profile
불편함을 고민하는 프론트엔드 개발자, 박민철입니다.

0개의 댓글