본문 바로가기
코테연습

179. 옹알이 Javascript

by hxunz 2023. 1. 20.

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
    머쓱이의 조카가 발음할 수 있는 단어의 개수를 구하라
  • 주어진 자료는 무엇인가?
    babbling: 조카가 발음할 수 있는 단어를 담은 배열 ('aya', 'ye', woo', 'ma')
  • 조건은 무엇인가?
    문자열은 소문자로만 이루어져 있다.

2. 계획

  • 연속되는 발음을 담은 변수를 생성한다.
  • babbling을 순회한다. 
  • 연속되는 발음은 카운트하지 않고 지나간다. 
  • 단어에서 가능한 발음을 공백으로 바꾼다.
  • 모두 발음 가능한 단어면 count++을 해준다. 

3. 실행

const speak = ['ayaaya', 'yeye', 'woowoo', 'mama'];

const solution = (babbling) => {
  let count = 0;

  while (babbling.length) {
    let word = babbling.shift();

    //연속되는 발음은 카운트 안하고 지나감
    if (speak.some((it) => word.includes(it))) continue;

    //단어에서 가능한 발음을 공백으로 바꾼다.
    word = word.replace(/(aya|ye|woo|ma)/g, '');

    //모두 발음 가능한 단어면 count++
    if (word.length === 0) count++
  }
  return count
};

test('solution', () => {
  expect(solution(["aya", "yee", "u", "maa"])).toEqual(1);
  expect(solution(["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"])).toEqual(2);
  expect(solution(['woowo'])).toEqual(0);
  expect(solution(['woayao'])).toEqual(0);
  expect(solution(['maayama'])).toEqual(1);
});

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
    정규표현식을 사용해서 해결할 수 있다. 
const solution = (babbling) => {
  //aya, ye, woo, ma 같은 단어가 연속으로 사용되었는지 아닌지 확인하는 정규 표현식
  const regexp1 = /(aya|ye|woo|ma)\1+/;

  //aya, ye, woo, ma가 있는지 아닌지 확인하는 정규 표현식
  const regexp2 = /^(aya|ye|woo|ma)+$/;
  let count = 0;

  for (let i = 0; i < babbling.length; i++) {
    !regexp1.test(babbling[i]) && regexp2.test(babbling[i]) ? count++ : 0
  }

  return count;
};

 

정규식을 이용한 다른 풀이

const solution = (babbling) => {
	return babbling
                .map((it) => it.replace(/aya(?!aya)|ye(?!ye)|woo(?!woo)|ma(?!ma)/g, ''))
                .filter((it) => it === '')
                .length;
 };

댓글