# 본인 풀이
#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;
}
- 로직 내에 테스트케이스 검증 여부에 대해 로직을 짜면
flag
라는 이름으로 변수명을 지어주자 - 다른 타입의 문자가 연속하여 등장함에 있어 판단할때 각 타입마다 변수를 두고 후위 증가연산자로 연속 여부를 판단할 수 있다.