<프로그래머스 C++> 옹알이(2) 풀이

2026. 5. 14. 10:04Programmers

문제


문제 파악

이 문제의 조건은 두 가지이다.

  • 단어 전체가 4가지 발음(aya, ye, woo, ma)의 조합으로만 이루어져야 한다.
  • 같은 발음이 연속으로 나오면 안 된다.

즉, 단어를 앞에서부터 탐색하면서 유효한 발음 위주로 끝까지 분해할 수 있는지 확인해야 한다.


문제 풀이

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> babbling) {
    int answer = 0;
    vector<string> lan = {"aya", "ye", "woo", "ma"};
    
    for(int i=0; i<babbling.size(); ++i)
    {
        int pos = 0;          
        string prev = "";     
        bool failed = false;

        while(pos < babbling[i].size())
        {
            bool matched = false;
            for(int j=0; j<lan.size(); ++j)
            {
                if(babbling[i].substr(pos, lan[j].size()) == lan[j]
                   && lan[j] != prev) 
                {
                    prev = lan[j];
                    pos += lan[j].size();  
                    matched = true;
                    break;
                }
            }
            if(!matched) { failed = true; break; }
        }

        if(!failed) ++answer;
    }
    
    return answer;
}

코드의 흐름

1. 각 단어를 순회

for(int i=0; i<babbling.size(); ++i)

배열의 단어를 하나씩 꺼내서 검사한다.

 

2. 단어 내 위치를 추적하며 발음을 소비

int pos = 0;      // 현재 단어 내 탐색 위치
string prev = ""; // 직전에 사용한 발음
bool failed = false;

while(pos < babbling[i].size())

 

pos가 단어의 끝에 도달할 때까지 반복한다.

 

3. 현재 위치에서 4가지 발음 중 매칭을 확인

babbling[i].substr(pos, lan[j].size()) == lan[j]
&& lan[j] != prev

substr(pos, 길이)로 현재 위치에서 발음 단위만큼 잘라 비교한다.

 

동시에 직전 발음과 같으면 연속 발음이기 때문에 스킵한다.

 

4. 매칭 성공 시 위치 전진, 실패 시 종료

pos += lan[j].size(); // 소비한 만큼 앞으로 이동

매칭된 발음의 길이만큼 pos를 증가시켜 위치를 변경한다.

 

어떤 발음도 매칭되지 않으면 failed = true로 종료한다.

 

5. 단어 전체 소비 성공 시 카운트

if(!failed) ++answer;

failed 없이 while문이 끝나 저 코드까지 도달했다는 것은 pos가 단어 끝에 도달했다는 의미이므로 발음 가능한 단어로 카운트한다.


핵심 포인트

1. substr(pos, 길이)

단어 전체를 한 번에 비교하는 것이 아닌, 현재 위치에서 발음 길이만큼 잘라서 비교해야 한다. 발음마다 길이가 다 다르기 때문이다.

 

2. 발음을 소비하는 방식 (pos += 길이)

매칭 성공 시 해당 발음의 길이만큼 pos를 전진시켜 다음 발음 탐색 위치로 이동한다. 이 방식으로 단어를 앞에서부터 순서대로 분해한다.

 

3. 연속 발음 방지( lan[j] != prev )

직전에 사용한 발음을 prev에 저장해 같은 발음이 연속으로 나오면 매칭하지 않는다.

 

4. 단어 전체 소비 여부로 최종 판단

pos == 단어 길이 상태로 while문이 정상 종료되어야 성공이다.중간에 어떤 발음오 매칭되지 않아 failed가 true가 되면 발음 불가로 처리한다.