
구현문제이다. 모음인지 자음인지를 확인하는 함수 isvowel()을 정의해놓고 main에서 모음,자음 구분 필요할때마다 호출해서 확인한다.
중요한것은..모음은 {a,e,i,o,u}로만 이루어져있고, 입력도 모음은 {a,e,i,o,u} 중에서만 나온다는 것이다.
(나는 모음이 전체가 나오는 건줄 알고,,카운팅 배열 만드려다가 이게맞나..싶어서 다른 방법 찾다가 틀렸다)
#include <bits/stdc++.h>
using namespace std;
char vowel[5]={'a','e','i','o','u'};
string s1 = " is acceptable.";
string s2 = " is not acceptable.";
int isvowel(char param) {
for(char c:vowel) {
if(param==c) return 1;
}
return 0;
}
int main() {
string s;
while(cin >> s) {
if(s=="end") break;
int include,mo_cnt,ja_cnt, no_flag;
include = mo_cnt = ja_cnt = no_flag = 0;
for(char c:s) {
if(isvowel(c)) include = 1, mo_cnt++, ja_cnt=0 ;
else mo_cnt=0, ja_cnt++;
if(mo_cnt==3||ja_cnt==3) {
no_flag=1;
break;
}
}
for(int i=0;i<(int)s.size()-1;i++) {
if(s[i]==s[i+1] && s[i]!='e' && s[i] != 'o') {
no_flag=1;
break;
}
}
if(!include || no_flag) {
cout << "<"+s+">"+s2+'\n';
continue;
}
cout << "<"+s+">"+s1+'\n';
}
return 0;
}
나는 입력도 모음이 {a,e,i,o,u}로만 이루어져 있다는 것을 뒤늦게 알았고, 그래서 틀렸다. 사실 예시 입력이 너무 길길래 문제 대충 이해하고 바로 풀이에 들어갔는데, 이게 패착인것같다.
귀찮더라도, 문제를 대충 다 이해한 것 같더라도 꼭 꼭 문제에서 주어지는 예시 입력은 확인해봐야한다.
if(isvowel(c)) include = 1, mo_cnt++, ja_cnt=0 ;
else mo_cnt=0, ja_cnt++;
위와 같이 코드를 작성하면 연속으로 등장하는 애들만 카운트가 가능하다.
연속으로 몇개 등장하는지 문제가 매우 많으니, 위의 코드 블럭을 사용할 곳이 많을 것 같다.
이 문제의 풀이를 보면 반복적으로 쓰이는 모음인지 확인 하는 기능은 따로 함수 isvowel()로 정의해뒀다.
이렇게 자주 쓰이는 기능은 위처럼 함수화해줘야 코드의 복잡도가 낮아지고, 코드도 짧아진다.
구현 문제는 그냥 복잡하게 생각하지말고 하라는대로 하면 될 것 같다.