[백준 알고리즘] 4659번: 비밀번호 발음하기

4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다.
어떤 사이트들은 xvtpzyo 같은 비밀번호를 무작위로 부여해 주기도 하지만, 사용자들은 이를 외우는데 어려움을 느끼고 심지어는 포스트잇에 적어 컴퓨터에 붙여놓는다.
가장 이상적인 해결법은 '발음이 가능한' 패스워드를 만드는 것으로 적당히 외우기 쉬우면서도 안전하게 계정을 지킬 수 있다. 회사 FnordCom은 그런 패스워드 생성기를 만들려고 계획중이다.
당신은 그 회사 품질 관리 부서의 직원으로 생성기를 테스트해보고 생성되는 패스워드의 품질을 평가하여야 한다.
높은 품질을 가진 비밀번호의 조건은 다음과 같다.

1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.

이 규칙은 완벽하지 않다. 우리에게 친숙하거나 발음이 쉬운 단어 중에서도 품질이 낮게 평가되는 경우가 많이 있다.

접근 방법:

문자열을 읽어와서 하나씩 문자형 변수로 읽으면서 조건을 모두 검사한다. 각 조건마다 플래그 변수를 두어서 최종적으로 플래그가 모두 통과조건에 해당할 경우에만 acceptable로 판정한다. 자음모음 여부는 해당 문자가 a, e, i, o, u 중 하나면 모음으로, 아니면 자음으로 판정하고 모음이 하나라도 나오면 1번 조건에 대한 플래그를 킨다. 그리고 자음모음이 연달아 나올때마다 그 갯수를 세서 3이 넘으면 2번 조건에 대한 플래그를 키고 두 글자가 연달아 나오면 e나 o인지 확인하고 아닐경우에 플래그를 키는 방식으로 순회를 진행한다.

통과 코드:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main (){
    while(true){
        char pwd [20];
        int vowelcnt = 0;
        int cnsntcnt = 0;
        bool isConsec = false;
        bool isSame = false;
        bool isVowel = false;

        scanf("%s", pwd);
        if (!strcmp(pwd, "end"))break;

        for(int i = 0 ; i < strlen(pwd); i++){
            // 자음모음 판정 //
            if (pwd[i] == 'a' || pwd[i] == 'e' || pwd[i] == 'i' || pwd[i] == 'o' || pwd[i] == 'u') {
                cnsntcnt = 0;
                vowelcnt++;
                isVowel = true;
            }
            else{
                vowelcnt = 0;
                cnsntcnt++;
            }

            // 연속된 자음, 모음 판정 //
            if (vowelcnt >= 3 || cnsntcnt >= 3) isConsec = true;

            // e, o를 제외한 연속되는 알파벳 판정 //
            if (i < strlen(pwd)){
                if(pwd[i] == pwd[i+1] && (pwd[i] != 'e' && pwd[i] != 'o')) isSame = true;
            }
        }

        if (!isVowel || isConsec || isSame) printf("<%s> is not acceptable.\n", pwd);
        else printf("<%s> is acceptable.\n", pwd);

    }
    return 0;
}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.