728x90
https://www.acmicpc.net/problem/4659
문제
생각
먼저 주어진 3가지 조건을 모두 만족해야 acceptable 이라고 할 수 있다.
- 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
모음이 중심이므로 한 글자씩 모음을 판별하면서 진행하면 될 것 같다.
2번은 이전전, 인덱스 기준 -2 를 판별하는 것이 아닌, 모음과 자음의 갯수 count를 각각 양수와 음수로 더하여 판별하면 된다.
즉, abs(count)를 진행했을 때 2를 넘어가면 return false해주면 된다.
3번은 이전 글자를 받아와서 매번 계속 확인해주면 된다. 이때 ee와 oo는 허용하는 케이스를 만들면 된다.
풀이
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
// 모음 판별기
bool check_vowels(char c){
return c =='a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
// 1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
// 2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
// 3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
bool process(string s){
bool rule1 = false;
const int MAX_WORD = 2;
char last = s[0];
bool last_vow = false;
int count = -1;
//초기값
if(check_vowels(last)){
rule1 = true;
last_vow = true;
count = 1;
}
//모음은 양수 count, 자음은 음수 count
for(int i = 1; i < s.length(); i++){
char c = s[i];
if(last == c){
if(c == 'e' || c == 'o'); //ee와 oo는 허용한다.
else return false; //조건 3. 불만족
}
if(check_vowels(c)){ //음수
rule1 = true;
if(last_vow){ //음수,음수
count++;
}
else{
count = 1;
}
last_vow = true;
}
else{ //양수
if(!last_vow){ //양수, 양수
count--;
}
else{
count = -1;
}
last_vow = false;
}
last = c;
if(abs(count) > MAX_WORD) return false; //조건 2. 불만족
}
return rule1;
}
void print(bool good, string password){
if(good){
cout << "<" << password << "> is acceptable." << endl;
}
else cout << "<" << password << "> is not acceptable." << endl;
}
int main(){
string password;
while(true){
cin >> password;
if(password == "end") break;
bool good = process(password);
print(good, password);
}
return 0;
}
728x90
'알고리즘 문제 > 구현' 카테고리의 다른 글
[개쉬운 풀이] 백준 16918 봄버맨 CPP (16일차) (0) | 2024.12.07 |
---|---|
[개쉬운 풀이] 백준 2467 용액 (10일차) - 이분 탐색X (0) | 2024.12.01 |
[개쉬운 풀이] 백준 9017 크로스 컨트리 (6일차) (0) | 2024.11.27 |
[개쉬운 풀이] 백준 2933 미네랄 (4일차) (0) | 2024.11.25 |
[개쉬운 풀이] 백준 14503 로봇 청소기 (0) | 2024.11.08 |