저장을 습관화

프로그래머스 LV.0 옹알이 (1) 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 옹알이 (1)

ctrs 2024. 3. 2. 06:39

프로그래머스 LV.0 옹알이 (1)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

옹알이 (1)


2. 문제 설명

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


3. 제한 사항

1 ≤ babbling의 길이 ≤ 100

1 ≤ babbling[i]의 길이 ≤ 15

babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.

즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.

문자열은 알파벳 소문자로만 이루어져 있습니다.


4. 예시

babbling result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3


5. 기본 제공 코드

function solution(babbling) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (babbling) => {
  let possible = ["aya", "ye", "woo", "ma"];
  const replace = (givenWord) => {
    for (j = 0; j < possible.length; j++) {
      while (givenWord.includes(possible[j])) {
        givenWord = givenWord.replace(possible[j], " ");
      }
    }
    return givenWord;
  };

  const removeBlank = (blank) => {
    while (blank.includes(" ")) {
      blank = blank.replace(" ", "");
    }
    return blank;
  };

  return babbling
    .map((v) => replace(v))
    .map((v) => removeBlank(v))
    .reduce((acc, cur) => (cur === "" ? (acc += 1) : acc), 0);
};

 

6-2. VSC에 작성한 내용

const solution = (babbling) => {
  // console.log("--------------구분선--------------");
  /**
   * 가능한 발음 "aya", "ye", "woo", "ma"과
   * 이 네 가지 발음을 최대 한 번씩 사용한 조합
   *
   * 1. 매개변수의 각 원소를 가져온다.
   * 2. 각 원소가 가능한 단어를 포함하고 있는지 검사한다.
   * 3. 포함하고 있다면, 공백으로 replace한다.
   * replace("possbleWord", " ")
   * 4. 모두 확인하고, 마지막으로 replace(" ", "") 한 다음
   * 문자열의 길이가 0인 원소들의 개수를 반환한다.
   */

  let possible = ["aya", "ye", "woo", "ma"];
  const replace = (givenWord) => {
    for (j = 0; j < possible.length; j++) {
      while (givenWord.includes(possible[j])) {
        givenWord = givenWord.replace(possible[j], " ");
      }
    }
    return givenWord;
  };

  // for (i = 0; i < babbling.length; i++) {
  //   replace(babbling[i]);
  // }

  const removeBlank = (blank) => {
    while (blank.includes(" ")) {
      blank = blank.replace(" ", "");
    }
    return blank;
  };

  return babbling
    .map((v) => replace(v))
    .map((v) => removeBlank(v))
    .reduce((acc, cur) => (cur === "" ? (acc += 1) : acc), 0);
};

// test
console.log(solution(["aya", "yee", "u", "maa", "wyeoo"]));
console.log(solution(["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]));


7. 특이사항

없음

프로그래머스 코딩 테스트 입문 단계에서는 정답률이 가장 낮은 문제였지만

나에게는 겹치는 선분의 길이 문제보다 훨씬 접근하기 편했다.


8. 다른 사람이 작성한 답

8-1. 정규표현식

function solution(babbling) {
  var answer = 0;
  const regex = /^(aya|ye|woo|ma)+$/;

  babbling.forEach(word => {
    if (regex.test(word)) answer++;  
  })

  return answer;
}