강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김지수님의 프로필 이미지
김지수

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

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;
}
김지수님의 프로필 이미지
김지수

작성한 질문수

질문하기