문제 출처

1. 문제설명


  • 비밀번호가 아래 규칙을 만족하는지 확인한다.
    • 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
    • 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
    • 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.



2. 알고리즘 설계


  • 문자열 구현 문제이다.
  • 특정 사이즈를 만족할 때, 조건을 확인하면 된다!



3. 로직


  • 모음을 검사하는 로직은 자주 쓰이니 함수로 구현해두는 것이 편했다.
    • 참고로 모음의 약자가 cons이다.
bool check_cons(char c) {
	if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') return true;
	return false;
}
  • 두 개의 bool 변수를 이용하였다.
    • 모음이 포함되어 있는지?
    • 연속된 두 글자가 왔는지? 모음 또는 자음이 연속 3개인지?



4. 전체 코드


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

bool check_cons(char c) {
	if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') return true;
	return false;
}

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

	while (true) {
		string str; cin >> str;
		if (str == "end") break;

		bool flag = true;
		bool con = false;

		for (int i = 0; i < str.size(); i++) {
			if (!con && check_cons(str[i])) con = true;

			if (i >= 1 && str[i] == str[i - 1] && str[i] != 'e' && str[i] != 'o') {
				flag = false;
				break;
			}

			if (i >= 2) {
				if (check_cons(str[i - 2]) == check_cons(str[i - 1]) && check_cons(str[i - 2]) == check_cons(str[i])) {
					flag = false;
					break;
				}
			}
		}

		string answer;
		if (flag && con) answer = " is acceptable.";
		else answer = " is not acceptable.";

		cout << '<' << str << '>' << answer << '\n';
	}

	return 0;
}