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

박기영·2022년 12월 13일
3

프로그래머스

목록 보기
109/126

solution

function solution(babbling) {
    const can = ['aya','ye','woo','ma'];
    let count = 0;
    
    for(let i = 0; i < babbling.length; i++){
        let babble = babbling[i];
        
        for(let j = 0; j < can.length; j++){
            if(babble.includes(can[j].repeat(2))){
                break;
            }
            
            babble = babble.split(can[j]).join(" ");
        }
        
        if(babble.split(" ").join("").length === 0){
            count += 1;
        }
    }
    
    return count;
}

방법은 다음과 같다.

말할 수 있는 단어를 가지고 있는 배열 can의 원소가 2번 이상 반복된다면 발음할 수 없으므로
break를 통해 다음 단어로 넘어간다.
여기서 2번 이상 반복인데 왜 repeat(2)로만 처리되는지 의문이 생길 수 있다.

아래 예시를 보자.
3번 반복되는 단어이다.

yeyeye

2번 이상 반복되는 순간부터는 무.조.건 2번은 반복된다.

...? 당연한 소리다.
아무튼, 2번 반복되는 것만 처리해도 2번 이상 반복되는 것까지 전부 처리할 수 있다는 뜻이다 :)

다음 코드로 넘어가자.
말할 수 있는 단어가 반복되지 않는다면, 배열 can의 원소로 split()을 진행한다.
그 후, join()을 해주는데...여기서 아마 많은 분들이 헤매지 않았을까 감히 생각해본다.

그냥 join("")을 해버리면, 단어가 재조합되면서 새로운 조건이 발생할 수도 있다.

아래 예시를 보자.

ayayyayae

위 단어는 배열 can의 원소들을 기준으로 나누보면

aya + y + aya + e

로 볼 수 있겠다.
aya를 지우고, 그냥 join("") 해버리면 어떻게 될까?

ye

이럴수가~! 새롭게 조합된 단어에 배열 can의 원소에 속하는 문자열이 포함되어버린다.
이 상황을 막아주지 않으면 문제를 해결할 수 없다.

그래서 생각해낸 방법은 join("") 대신 join(" ")을 하는 것이었다.
그냥 단순하게 알파벳 소문자가 아닌 문자열로 join()을 하는 것이다.
그렇게 되면 위 예시는

y e

가 되어서, 배열 can 내에 있는 문자열과는 일치하지 않게된다!

이렇게, 배열 can의 모든 문자에 대하여 연산을 마친 babble
필자의 방법 기준, 공백 문자(" ")로 나누어져 있으므로
공백 문자를 제거하여 다시 재조합해준다.

재조합한 문자의 길이가 0이 아니라면 배열 can 내에 들어있는 원소 외의 다른 문자가 포함된 것이므로,
발음할 수 없는 단어이기 때문에 아무런 연산을 하지 않는다.

즉, 재조합한 문자열은 ""이어야지 발음할 수 있는 것이므로
문자열의 길이가 0이면 count를 증가시킨다.

profile
나를 믿는 사람들을, 실망시키지 않도록

1개의 댓글

comment-user-thumbnail
2023년 2월 5일

ㅈ나 천재인듯 메서드 활용한거와 행님의 외모에 감탄하고 갑니다

답글 달기