본문 바로가기
알고리즘 문제/구현

[개쉬운 풀이] 백준 4659 비밀번호 발음하기 (7일차)

by odaebum 2024. 11. 28.
728x90

https://www.acmicpc.net/problem/4659

 

문제

 

생각

먼저 주어진 3가지 조건을 모두 만족해야 acceptable 이라고 할 수 있다.

  1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
  2. 모음이 3개 혹은 자음이 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