본문 바로가기
개발적인/알고리즘

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

by klm hyeon woo 2022. 11. 8.

오늘은 여러 기업의 코딩테스트를 준비하면서, 연습할겸 코딩테스트 문제를 풀어보았다.

가장 눈에 들어온 것이 문제 제목이 귀여운 옹알이라는 녀석이었는데, 문제도 참 귀엽다.

 

옹알이(1) 문제 설명
옹알이(1) 테스트케이스

말그래도 아이가 말할 수 있는 단어를 하나하나 분리하여 아이가 말을 할 수 있는지에 대한 판단 여부를 출력하는 문제이다. 처음에는 해당 babbling 각 배열 요소에 아이가 말할 수 있는 단어가 포함이 되어있는지를 확인을 하였다. 정상적으로 결과 값이 출력되는 것을 확인할 수 있었으나, 추가적으로 `wyeoo`와 같이 사이에 `ye`를 포함하게되고 이는 또 `woo`로 줄여져 카운팅되는 문제점을 확인할 수 있었다.

 

이를 해결하기 위해 기존 반복문 안에 해당 단어의 인덱스를 찾고, 그 인덱스가 0으로 시작하는 것이 아니면 카운팅 되지 않는 것으로 로직을 설계하였고 이렇게 하면 1번에서 마주하는 사이 단어를 먼저 지우고 지워진 단어에서 추가적으로 또 지워지는 과정이 해결이 된다.

 

1번 로직을 해결했다면, 문제는 또 2번에서 발생을 한다. 2번에서 인덱스가 0일때 단어를 지워야하기 때문에 아이가 말할 수 있는 단어를 순차적으로 지우게 되는데, 이때 배열을 한번만 돌기 때문에 `aya(1) - ye(2) - woo(3) - ma(4)`와 같이 배열을 구성하였다면 2번 테스트케이스에서는 `yemawoo = ye(2) - ma(4) = woo` 3번을 건너뛰어 단어를 지우게 된다.

 

이를 해결하기 위해 반복문 안에 map 함수를 사용하여 해당 아이템을 한번 더 최종적으로 지워주는 과정을 시도하였고, 원활하게 테스트케이스와 기타 반례 케이스들에 대해 해결을 할 수 있었다.

 

function solution(babbling) {
    const canSpeak = ['aya', 'ye', 'woo', 'ma'];
    let answer = 0;
    
    for (let j=0; j<babbling.length; j++) {
        for (let i=0; i<babbling.length; i++)
        {
            canSpeak.map((item) => {
                if (babbling[j].includes(item)) {
                    if (babbling[j].indexOf(item) === 0) {
                        babbling[j] = babbling[j].replace(item, '');
                        if (babbling[j] == "") {
                            answer += 1;
                        }
                    }
                } 
            });
        }
    }

    return answer;
}

'개발적인 > 알고리즘' 카테고리의 다른 글

[프로그래머스] JadenCase 문자열 만들기  (0) 2022.09.16
[백준] 1931번  (0) 2022.05.08
[백준] 11047번  (0) 2022.05.06
[백준] 11399번  (0) 2022.05.06
[백준] 2839번  (0) 2022.05.06

댓글