<프로그래머스 C++> 옹알이(2) 풀이
2026. 5. 14. 10:04ㆍProgrammers
문제

문제 파악
이 문제의 조건은 두 가지이다.
- 단어 전체가 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가 되면 발음 불가로 처리한다.
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 체육복 풀이 (0) | 2026.05.18 |
|---|---|
| <프로그래머스 C++> 두 수의 짝꿍 풀이 (0) | 2026.05.15 |
| <프로그래머스 C++> 로또의 최고순위와 최저순위 (0) | 2026.05.13 |
| < 프로그래머스 C++ > 페인트 칠하기 (0) | 2026.05.11 |
| < 프로그래머스 C++ > 소수 만들기 (1) | 2026.05.08 |