문제

문제 해석
- "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합
- 연속해서 같은 발음을 하는 것은 불가능
- 따라서
1. 반복문으로 babbling에 들어있는 문자열을 네 가지 발음 각각의 길이(2개, 3개)로 쪼개서(substr 활용) 할 수 있는 발음 문자열과 같은지 비교하고
2. 이전에 한 발음 문자열과 같은지를 판별하여 전부 통과한다면 증가시키면 된다.
코드
#include <string>
#include <vector>
using namespace std;
int solution(vector<string> babbling) {
// 발음할 수 있는 것은 아래의 4개만 가능
vector<string> CanBabbling = {"aya", "ye", "woo", "ma"};
int Answer = 0;
// 네 가지 발음을 조합해서 하되, 연속으로 같은 발음은 할 수 없다.
bool bIsCorrect = true;
size_t BabblingMax = babbling.size();
int BeforeBabbleIDX = -1;
string Length3Word, Length2Word;
size_t EachBabblingLength = 0;
for(int BabblIDX = 0; BabblIDX < BabblingMax; ++BabblIDX)
{
bIsCorrect = true;
// 한 개씩 검사한다.
int BeforeBabbleIDX = -1;
EachBabblingLength = babbling[BabblIDX].length();
for(int CHARIDX = 0; CHARIDX < EachBabblingLength;)
{
Length3Word = babbling[BabblIDX].substr(CHARIDX, 3);
Length2Word = babbling[BabblIDX].substr(CHARIDX, 2);
if(Length3Word == CanBabbling[0])
{
if(BeforeBabbleIDX == 0)
{
bIsCorrect = false;
break;
}
BeforeBabbleIDX = 0;
CHARIDX += 3;
}
else if(Length3Word == CanBabbling[2])
{
if(BeforeBabbleIDX == 2)
{
bIsCorrect = false;
break;
}
BeforeBabbleIDX = 2;
CHARIDX += 3;
}
else if(Length2Word == CanBabbling[1])
{
if(BeforeBabbleIDX == 1)
{
bIsCorrect = false;
break;
}
BeforeBabbleIDX = 1;
CHARIDX += 2;
}
else if(Length2Word == CanBabbling[3])
{
if(BeforeBabbleIDX == 3)
{
bIsCorrect = false;
break;
}
BeforeBabbleIDX = 3;
CHARIDX += 2;
}
else
{
bIsCorrect = false;
break;
}
}
if(bIsCorrect)
{
++Answer;
}
}
return Answer;
}
다른 사람의 풀이
1. 범위 기반 반복문을 사용해 문자를 문자열(Temp1)에 더해나가는 방식으로 발음할 수 있는 문자열과 같은 문자열인지 매 회 검사하여 통과할 때의 문자열을 기록(Temp2, 같은 발음 불가능 검사)하고 새로운 문자열 검사를 위해 줄여준다. 만약 babbling의 원소 1개를 검사가 끝났을 때, Temp1의 길이가 0이면 Answer를 증가시키는 풀이 방식
2. babbling을 범위 기반 반복문으로 반복하고 substr을 활용해 문자열을 검사한다.
회고
1. 범위 기반 반복문도 좀 더 고려해 볼 필요가 있다.