# 본인 풀이

#include<bits/stdc++.h>
using namespace std;

string a = "aeiou";

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    string t;
    while(1){
        cin >> t;
        if(t == "end"){
            break;
        }
        int check = 0;
        // 1. aeiou가 포함되는지 체크
        for(char chr : a){
            // aeiou를 찾았으면 - check 1 하고 탈출
            if(t.find(chr) != string::npos){
                check = 1;
                break;
            }
        }
        if(t.size() == 1 && (a.find(t) != string::npos)){
            cout << "<" << t << "> is acceptable."
                 << "\n";
            continue;
        }
        if(!check){
            cout << "<" << t << "> is not acceptable." << "\n";
            continue;
        }
        // 2. 같은 자음 / 같은 모음이 아니라, 모음이 연속적인지 자음이 연속적인지 체크
        //  2-1. 동일하다면, ee인지 oo인지 체크
        for (int i = 0; i < t.size() - 2; i++){
            // i와 i+1, i+2이 셋다 자음인가 ? -> a에서 t[i]와 t[i+1], t[i+2]가 안찾아지면 됨
            if(a.find(t[i]) == string::npos && a.find(t[i+1]) == string::npos && a.find(t[i+2]) == string::npos){
                check = 0;
                break;
            }

            // i와 i+1, i+2가 셋다 모음인가?
            if(a.find(t[i]) != string::npos && a.find(t[i+1]) != string::npos && a.find(t[i+2]) != string::npos){
                check = 0;
                break;
            }
        }

        for (int i = 0; i < t.size() - 1; i++){
            // 연속으로 같은글자가 오지만, ee또는 oo는 아닌지 검사
            if(t[i] == t[i+1]){
                if(t[i] == 'e' || t[i] == 'o'){
                    continue;
                }
                check = 0;
                break;
            }
        }

        if (check)
        {
            cout << "<" << t << "> is acceptable."
                    << "\n";
        }
        else
        {
            cout << "<" << t << "> is not acceptable."
                    << "\n";
        }
    }

    return 0;
}

# 모범 답안

#include<bits/stdc++.h>
using namespace std;
string s;
int lcnt, vcnt;

bool isVowel(int idx){
    return (idx == 'a' || idx == 'e' || idx == 'i' || idx == 'o' || idx == 'u');
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    while(true){
        cin >> s;

        if(s == "end")
            break;
        lcnt = vcnt = 0;
        bool flag = 0;
        bool is_include_v = 0;
        int prev = -1;

        // 순회중인 문자가 모음이면 vcnt + 1, 자음이면 lcnt + 1
        // vcnt가 3이거나 lcnt가 3이면 연속 3번 등장했다는 의미
        for (int i = 0; i < s.size(); i++){
            int idx = s[i];
            if(isVowel(idx)){
                lcnt++;
                vcnt = 0;
                is_include_v = 1;
            }else{
                vcnt++;
                lcnt = 0;
            }

            if(vcnt == 3 || lcnt == 3){
                flag = 1;
            }
            // 동일한 문자가 연속 두번 등장하는지
            // 순회 범위를 -1까지 한정하지 말고 시작범위를 1로 설정하자.
            if(i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o')){
                flag = 1;
            }
            prev = idx;
        }

        // 모음이 하나도 포함되지 않았다면 -> not acceptable
        if(is_include_v == 0){
            flag = 1;
        }

        if(flag){
            cout << "<" << s << "> is not acceptable.\n";
        }else{
            cout << "<" << s << "> is acceptable.\n";
        }
    }

    return 0;
}
  1. 로직 내에 테스트케이스 검증 여부에 대해 로직을 짜면 flag라는 이름으로 변수명을 지어주자
  2. 다른 타입의 문자가 연속하여 등장함에 있어 판단할때 각 타입마다 변수를 두고 후위 증가연산자로 연속 여부를 판단할 수 있다.