프로그래머스 풀이

[c++][javascript] 옹알이(1)

Iam_noob 2024. 10. 24. 20:07
728x90
반응형

출처: 프로그래머스

문제 설명

머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 15
  • babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

입출력 예

babbling result
["aya", "yee", "u", "maa", "wyeoo"] 1
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] 3

 

문제 설명

 

c++

#include <string>
#include <vector>
#include <unordered_set>

using namespace std;

int solution(vector<string> babbling) {
    int answer = 0;
    unordered_set<string> wordSet = { "aya","ye","woo","ma" };
    
    for(int i = 0; i < babbling.size(); i++)
    {
        vector<bool> dp(babbling[i].size()+1,false); 
        // dp[0] 빈문자열이기에 사이즈보다 1개 더 더해야한다. 
        dp[0] = true; //false이면 다음 단어를 찾아도 if문에서 넘어가지 못함, 빈문자열은 true로 설정해야 함
        for(int j = 1; j <= babbling[i].length(); j++)
        {
            for(int k = 0; k < j; k++)
            {
                string word = babbling[i].substr(k, j-k);//문자열자르기
                //이전 문자열 조합이 true인지, 자른 문자열이 주어진 단어중에 있는지 확인
                if(dp[k] && wordSet.find(word) != wordSet.end()) 
                {
                    dp[j] = true;
                    break;
                }
            }
        }
           if(dp[babbling[i].length()] == true)
            {
                answer++;
            }
    }
    return answer;
}

 

 

자바스크립트

function solution(babbling) {
    let answer = 0;
    const wordSet = new Set(["aya", "ye", "woo", "ma"]);
    
    for (let i = 0; i < babbling.length; i++) {
        let dp = Array(babbling[i].length + 1).fill(false);
        dp[0] = true;  // 빈 문자열은 항상 true

        for (let j = 1; j <= babbling[i].length; j++) {
            for (let k = 0; k < j; k++) {
                let word = babbling[i].substring(k, j);  // 부분 문자열 추출
                if (dp[k] && wordSet.has(word)) {  // dp[k]가 true이고, 부분 문자열이 단어 목록에 있으면
                    dp[j] = true;
                    break;
                }
            }
        }
        
        if (dp[babbling[i].length] === true) {
            answer++;
        }
    }
    return answer;
}

 

동적계획법 dp 배열에 대해 공부했던 문제였다. 문제를 봤을 때 쉬워보이지만 막상 풀어보려니 복잡했다. 위 방법을 알아내고 적용하여 풀어보니 이해가 되었다. 다른 방법도 있었는데, 다른 방법도 다음에는 풀어보고 답을 찾는 속도까지도 비교해보면 좋을 것 같다.

 

728x90
반응형

'프로그래머스 풀이' 카테고리의 다른 글

[c++]정수 삼각형  (2) 2024.10.28
[c++] 이중우선순위큐  (2) 2024.10.28
[c++]같은 숫자는 싫어  (3) 2024.10.24
[c++]최빈값 구하기  (1) 2024.10.21
[c++]중앙값 구하기  (0) 2024.10.21