알고리즘

백준 : : 4659번 비밀번호 발음하기 - C++ 풀이

green333 2022. 1. 11. 15:27
728x90
SMALL

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

 

4659번: 비밀번호 발음하기

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

www.acmicpc.net

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string>
using namespace std;
bool checkAEIOU(string str){ //모음 없으면 false
    if(str.find("a"== string::npos && str.find("e"== string::npos && str.find("i"== string::npos && str.find("o"== string::npos && str.find("u"== string::npos){
        return false;
    }
    return true;
}
 
int checkCV(char a){ //모음인지 자음인지 
    switch(a){
        case 'a'case 'e' : case 'i' : case 'u'case 'o'return 2;
        default : return 1;
    }
}
 
int main(void){
    string password;
    bool flag = true;
 
    cin >> password;
    while(password!="end"){
        flag = true;
        if(!checkAEIOU(password)){ //모음 없으면 여기서 거른다.
            cout << "<" << password << "> is not acceptable." << endl;
            cin >> password;
            continue;
        }
    
        if((password.size() == 2&& (password[0== password[1]) && (password[0]!= 'e' && password[0]!= 'o')){
            cout << "<" << password << "> is not acceptable." << endl;
            cin >> password;
            continue;
        }
        else if(password.size() > 2){
            for(int i = 0 ; i < (password.size() - 2) ; i++){//3 -> 1, 4 -> 2, 5 -> 3 ... 
                if(password[i] != 'e' && password[i] != 'o'){
                    if(password[i] == password[i+1]){
                        flag = false;
                        break;
                    }
                }
                if(password[i+1!= 'e' && password[i+1!= 'o'){
                    if(password[i+1== password[i+2]){
                        flag = false;
                        break;
                    }
                }
                if(checkCV(password[i]) == checkCV(password[i+1]) && checkCV(password[i+1]) == checkCV(password[i+2])){
                    flag = false;
                    break;
                }
            }
        }
        if(flag) cout << "<" << password << "> is acceptable." << endl;
        else cout << "<" << password << "> is not acceptable." << endl;
        cin >> password;
    }
    return 0;
}
 
cs

 

 

문제 풀이

 

세 가지 조건을 만족시켜야한다.1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.

  1. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
  2. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.

모음이 없을 경우 바로 처리해주고 알파벳 개수가 3개가 넘어갈때만 for문을 수행하게 했다.

그래서 한번에 세 문자씩 접근하여 모음 혹은 자음이 연속으로 3개가 오는지 확인했다.

 

비교, 논리 연산자 코드에서 계속 실수가 발생한다. 정신차리자 ㅡㅡ

 

LIST