프로그래머스 0단계 - 옹알이 (1)

이종현·2024년 1월 25일
0

코딩테스트

목록 보기
23/24
post-thumbnail

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

유의사항

  • 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.

※ 공지 - 2022년 10월 27일 문제 지문이 리뉴얼되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.


1. 문제 이해

  • 아기는 4개의 단어를 조합해서만 이야기할 수 있다. 다른 단어는 포함되지 않는다.
  • 조합되는 단어의 길이는 15를 넘지 않으며 말하는 모든 조합된 단어는 100을 넘지 않는다. 따라서 시간 복잡도는 문제 없다.
  • 말할 수 있는 조합된 단어의 갯수를 리턴한다.

2. 접근 방법

  • 직관적으로 생각하기
    - 정해진 4개의 단어가 옹알이에 포함되어 있으면 split로 단어를 빈 문자열로 반복적으로 치환해나간다.
    - 이때 4개의 단어는 조합된 단어에서 한 번만 등장해야 하는데, 두 번 이상 등장하면 잘못 조합된 단어이므로 이 부분에 대한 처리를 한다.

3. 코드 설계

  • 직관적으로 생각하기
    - const babyWord = ['aya', 'ye', 'woo', 'ma']
    - let result = babbling
    - for (let i = 0; i < babbling.length; i++)
    • for (let j = 0; j < babyWord.length; j++)
      • result[i] = result[i].replace(babyWord[j], ' ')
    • return result.filter((v) => !v.trim()).length

4. 코드 구현

function solution(babbling) {
  const babyWord = ['aya', 'ye', 'woo', 'ma']
  let result = babbling

  for (let i = 0; i < babbling.length; i++) {
    for (let j = 0; j < babyWord.length; j++) {
      result[i] = result[i].replace(babyWord[j], ' ')
    }
  }

  return result.filter((v) => !v.trim()).length
}

다른 사람 풀이

function solution(babbling) {
  const word = ['aya', 'ye', 'woo', 'ma']

  return babbling
    .map((str) => {
      for (const w of word) {
        if (str.includes(w)) {
          str = str.replace(w, ' ')
        }
      }
      return str
    })
    .filter((str) => !str.trim()).length
}

회고

테스트 17번을 계속 통과하지 못하고 있다가, 결국 이번에는 구글링해서 다른 사람 풀이를 어느 정도 참고해서 진행했다. 처음에는 한 번 등장한 단어의 수를 카운팅해서 1이상이면 0을 리턴하고 아닌 경우에만 조건을 만족하는 옹알이 단어의 수를 구했었다. 그런데 17번 테스트가 계속 통과가 안되서, 결국.. 참고했다. 그렇게 해서 처음에는 split를 이용했었는데, 이 경우 replace가 더 좋은 대안이라는 걸 알게되었다.

profile
데이터리터러시를 중요하게 생각하는 프론트엔드 개발자

0개의 댓글