본문 바로가기

PS_Baekjoon

[백준 C++] 4659번 : 비밀번호 발음하기

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

 

4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp

www.acmicpc.net

풀이 :
- 문제에서 요구하는 그대로 조건을 걸어주면 된다
- 모음이 등장하는지, 모음이나 자음이 3 이상 연속으로 나오지는 않는지,
   같은 알파벳이 2번 나오는데 그게 e와o가 아닌지
- 전부 조건을 걸어주고 잘 통과했다면 acceptable을, 그렇지 않다면 not acceptable을 출력
 
코드 :

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

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

    int v_cnt, c_cnt;
    string s;
    bool vowel, res;

    while(1){ //end 나오기 전까지 무한 반복
        cin >> s;
        v_cnt = c_cnt = 0; //모든 문자열에 대해 검사해야 하기 때문에 초기화 필요
        res = true;
        vowel = false;
        if(s == "end"){ //end가 나오면 종료
            break;
        }
        for(int i=0; i<s.size(); i++){
            if((s[i] == 'a') || (s[i] == 'e') || (s[i] == 'i') || 
                (s[i] == 'o') || (s[i] == 'u')){ //모음이 나왔다면
                    vowel = true; //모음 등장 여부 체크
                    v_cnt++; //모음 카운트
                    c_cnt = 0; //자음 카운트 초기화
            }else{ //자음이 나왔다면
                c_cnt++; //자음 카운트
                v_cnt = 0; //모음 카운트 초기화
            }
            if(i > 0 && (s[i] == s[i-1]) && ((s[i] != 'e') && (s[i] != 'o'))){
                res = false; //같은 문자가 2번 나왔는데 e와 o가 아니라면 false 체크하고 종료
                break;
            }
            if((c_cnt > 2) || (v_cnt > 2)){ //모음이나 자음이 3이상 연속으로 나온다면
                res = false; //false 체크하고 종료
                break;
            }
        }
        if(!vowel){ //모음이 등장한 적이 없다면 false
            res = false;
        }
        if(res){ //조건에 부합한다면
            cout << '<' << s << '>' << " is acceptable.\n";
        }else{
            cout << '<' << s << '>' << " is not acceptable.\n";
        }
    } 
}