인프런 커뮤니티 질문&답변
4659 왜 틀렸는지 모르겠습니다!! ㅠㅠㅠ
작성
·
209
0
http://boj.kr/ca60372b1b164eccb71722f04693b65f
안녕하세요 선생님,
4659 비밀번호 발음하기 문제를 열심히 풀었습니다.
하지만 제출한 경우 틀렸다고 나오네요ㅠ 왜그런지 이유를 알고 싶은데 피드백 주시면 감사하겠습니다!!
답변 1
0
큰돌
지식공유자
안녕하세요. ㅎㅎ 3번 연속 부분에 로직이 잘못된 것같은데요.
주석을 달았으니 확인 부탁드립니다.
#include<iostream>
#include<algorithm>
#include<string>
#include<tuple>
#include<vector>
#include<map>
using namespace std;
string s;
char mo[5] = {'a','e','i','o','u'};
int flag = 0;
// good
/*
모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
*/
int test1(){
int haveMo = 0;
for(int i=0; i<5; i++)
if(s.find(mo[i])!=string::npos){
haveMo = 1;
break;
}
return haveMo;
}
int checkMo(char a){
if(a==101||a==105||a==111||a==117||a==121) return 1;
return 0;
}
int test2(){
int triple = 0; int flag = 0; //if char is mo, flag is 1.
if(s.size()<3) return 0;
char prev = s[0];
flag = checkMo(prev);
triple++;
for(int i=1; i<s.size()&&triple<3; i++){
char now = s[i];
if(checkMo(now)==flag){
triple++;
prev = now;
}
else{
triple = 1;
flag = !flag;
prev = now;
}
}
//이걸 왜 여기서 확인하죠?
if(triple>=3) return 1;
else return 0;
}
// good
int test3(){
int twice = 0;
if(s.size()<2) return 0;
char prev = s[0];
for(int i=1; i<s.size()&&!twice; i++){
char now = s[i];
if(prev==now){
if(prev=='e'||prev=='o') continue;
else
twice = 1;
}
else {
prev = now;
}
}
return twice;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
while(1){
cin >> s;
flag = 0;
if(s=="end") break;
for(int i=0; i<3&&!flag; i++){
if(i==0) flag = !test1();
else if(i==1) flag = test2();
else if(i==2) flag = test3();
}
if(flag) cout<<"<"<<s<<"> is not acceptable.\n";
else cout<<"<"<<s<<"> is acceptable.\n";
}
return 0;
}




