한 걸음씩

[프로그래머스][JS] 옹알이 (1) ✅ 본문

Programmers

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

winter17 2023. 8. 7. 22:33

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

 

프로그래머스

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

programmers.co.kr

풀이 과정

function solution(babbling) {
    var answer = 0;
    const arr = ['aya', 'ye', 'woo', 'ma']
    for (let b of babbling){
        let speaking = 0
        for (let a of arr){
        	// index를 찾지 못하는 경우 -1를 반환
            if (b.indexOf(a) !== -1){ // 단어b에 a가 존재하면
                speaking += a.length // a길이를 더하고
            }
        }
        if (speaking === b.length){ // 단어 b의 반복이 끝나면 speaking과 b의 길이를 비교하여 계산
            answer++
        }
    }
    return answer;
}

b가 'ayaye'일 때, 

arr = ['aya', 'ye', 'woo', 'ma']

'ayaye'.includes('aya') → 0

'ayaye'.includes('ye') → 0

'ayaye'.includes('woo') → -1

'ayaye'.includes('ma') → -1

-1인 경우에는 if문을 통과하지 못하므로 건너뛴다

그렇다면 -1이 아닌 수가 나오면 arr 배열의 각 단어 a의 길이를 speaking에 누적하여 더해주는데

'ayaye'.includes('aya') → 0 → speaking = 3

'ayaye'.includes('ye') → 0 → speaking = 5

여기까지가 babbling 배열에서 첫 번째 단어 'ayaye'의 한 사이클이다.

다음 단어로 넘어가기 전에 b의 길이와 speaking의 수를 비교하여 같다면 answer에 +1을 하고

여기서 b의 길이와 speaking의 수가 같아야 answer에 +1을 하는 이유는 문제에서 arr 배열에서의 문자로만 조합하고 최대 1번만 사용하여 단어를 만드는 게 요구조건이기 때문에 두 수가 다르다면 문제의 조건을 만족하지 못하게 되는 것이다.

그리고 다음 단어로 넘어가 위의 과정을 반복한다.


리뷰

이 문제는 처음에 문자를 다 쪼개서 접근을 하려다가 방법이 잘못된 것 같아서 

질문하기에 있는 코드를 참고했는데 indexOf 메서드를 사용한 것을 보았다. 

indexOf메서드는 인덱스를 찾을 때만 사용해 봤지 문자열을 찾을 때는 사용해 본 적이 없어서 생각조차 하지 않았다.

왜 단어의 길이를 더하는지, 왜 단어의 길이로 비교하는지에 대해 코드를 하나씩 읽어보니까 이해가 됐다.

어떻게 단어의 길이를 더해서 비교할 생각을 한 건지 진짜 신기하다... 혼자서는 생각하지 못할 코드였다.