[프로그래머스] 옹알이 (2) JavaScript

·2024년 4월 7일

문제

머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

제한 사항

1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 30
문자열은 알파벳 소문자로만 이루어져 있습니다.

입력

babbling : ["aya", "yee", "u", "maa"]

출력

1

내가 했던 풀이 방법

발음할 수 있는 단어를 계산하는 방법은 이전 옹알이 (1)에서 풀이한 방법을 기본으로 하여 연속해서 같은 발음을 하는 경우를 제외하여 계산하였다. 옹알이(1) 풀이 보러가기

  1. 발음할 수 있는 단어들을 모두 " "로 변환해준다. (이때, ""로 바꿔주지 않고, " "로 바꿔주어야 한다. 2번에서 이유를 설명한다.)
  2. 변환된 단어를 공백을 제거하여 ""와 비교했을 때 같을 경우 3번을 진행하고, 같지 않을 경우 다음 단어를 검사한다. (1번에서 " "로 바꿔주고 굳이 trim을 사용하는 이유는 연산순서 때문이다. 만약 yayae가 있다고 가정했을 때, 연산순서에 의해 aya가 제외되고, ye가 남게 된다. 즉, 원래는 ye가 아닌 단어가 ye가 되어 ""로 변환되기 때문에 공백을 두어 의도하지 않은 단어가 변환되는 것을 방지한다. 그 뒤에 trim을 통해 공백을 지워주면 모든 단어를 발음할 수 있는 경우, ""와 동일해진다.)
  3. 발음할 수 있는 단어가 연속되어 나타나는 경우가 없는 경우 발음할 수 있는 단어로 판단하여 answer를 1 증가시켜준다. (연속되어 나타나는 경우는 발음할 수 있는 단어를 두 번 연결하여 indexOf를 통해 해당 문자열이 단어에 있는지를 검사해준다.)

코드

function solution(babbling) {
    var answer = 0;
    for(let i=0; i<babbling.length; i++) {
        if(babbling[i].replaceAll("aya", " ").replaceAll("ye", " ").replaceAll("woo", " ").replaceAll("ma", " ").trim()==="") {
            if(babbling[i].indexOf("ayaaya")===-1 && babbling[i].indexOf("yeye")===-1 && babbling[i].indexOf("woowoo")===-1 && babbling[i].indexOf("mama")===-1) {
                answer++;
            }
        }
    }
    return answer;
}

회고

옹알이(1)번이 푸는 게 오래걸렸어서 그런지 풀이 방법이 바로 기억이 났다. 연속된 단어까지 해결하고 실행했는데, 몇가지 테스트 케이스에서 오류를 출력했다. 풀이 방식이 잘못된 건 아닐 것 같아 억까하는 케이스를 어떻게 만들 수 있을까 생각해보다가 replace했을 때, 지워지게 되는 case가 생기나?하고 바로 ""을 " "으로 바꿔보니 해결됐다. 이 방법을 혼자 생각해낸 것과 빨리 찾은 것도 뿌듯해서 기록용으로 남기기로 했다.

profile
Frontend🍓

0개의 댓글