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

재오·2023년 6월 18일
1

코딩테스트

목록 보기
43/46
post-thumbnail

🗒️ 문제

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

⚠ 제한사항

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

📝 문제 해설

문제 설명은 매우 짧아서 쉬워보였지만 생각보다 신경써야 할 점과 예외처리를 해야하는 점이 많아서 시간이 오래 걸렸던 문제이다. 우선 할 수 있는 발음을 모아둔 배열을 하나 만들고 babbling 배열에서 해당 언어가 포함되어 있으면 해당 언어를 ''으로 대체시켰다. 그래서 최후에 배열 안에 ''만 남아있는 것만 카운트를 증가시켜서 카운팅을 반환하는 방법을 적용하였다.

하지만 문제 조건 중에서 연속되는 단어는 등장할 수 없다고 하였다. 따라서 변수 K에 대체시키 직전에 적용되었던 단어를 넣어두고 그 값이 같으면 비교를 하지 않았다. 그리고 똑같은 단어가 중복으로 등장할 수 있었기 때문에 다시 index 비교를 한칸 뒤에서부터 하였다.

하지만 첫번째와 같이 계속 실패가 떠서 몇가지 테스트 케이스를 넣었다. 내가 풀었던 방법의 문제점이 하나 있었다. 바로 저 빨간 줄이 뜬 케이스와 같이 "aya"를 제거하고 합치게 되면 "ye"가 된다. 그러면 또 배열에 있는 단어이기 때문에 총 카운트가 1이 되고만다. 이러한 방법을 없애고자 우선 K라는 변수에 단어를 넣는 것이 아니라 첫번째 if문에서 단어가 연속해서 있는 것은 아예 카운트를 하지 않고 break를 걸어준다. 그리고 찾고자 하는 단어가 있는 경우에도 ""가 아닌 "0"을 넣어서 절대 다른 단어끼리 후에 합쳐지는 일이 없도록 해준다. 그러고 나서 최종적으로는 1로 나누었을 때 나머지가 0인 경우에만 카운트를 증가시켜 원하는 리턴 값을 반환하면 된다.

💡 필요 문법

indexOf(K)

문자열에서 "K"가 들어있는지 확인하기 위해서 쓰인다. K에 해당되는 index 값을 리턴한다.

str.replace(A, B)

문자열 str에서 "A"를 "B"로 대체한다.

💻 코드

function solution(babbling) {
    let speak = ["aya", "ye", "woo", "ma"]; // 가능한 언어를 모아둔 배열이다
    
  	// babbling 배열에서 speak가 가능한 언어를 추출해내는 반복문이다
    for(let i=0; i<babbling.length; i++){
        for(let j=0; j<4; j++){
            if(babbling[i].indexOf(speak[j]+speak[j]) !== -1) break; // 똑같은 언어가 연달아서 등장하면 무시한다
            else if(babbling[i].indexOf(speak[j]) !== -1){
                babbling[i] = babbling[i].replace(speak[j], "0"); // speak가 가능한 언어가 있다면 해당 단어를 "0"으로 변경한다
                j--; // 똑같은 언어가 뒤에도 등장할 수 있기 때문에 같은 단어를 다시 적용시켜보기 위해 j--를 해준다
            }
        }
    }
    let cnt = 0;
  	// 배열의 원소값이 0으로만 이루어진 경우는 카운트를 증가시킨다
    for(let i=0; i<babbling.length; i++){
        if(Number(babbling[i])%1 === 0)cnt++;
    }
    return cnt; // 카운트 값 리턴
}
profile
블로그 이전했습니다

0개의 댓글