c++/알고리즘

백준-4659 비밀번호 발음하기

hojung 2022. 4. 6.
728x90
반응형

문제는 다음과 같다.

이 때 문제에서 고려할 것은 3가지이다. 

모음이나 자음이 3번 연속으로 오면 안된다. 

e나 o를 제외한 같은 글자가 2번 연속으로 오면 안된다. 

모음(a, e, i, o, u)을 하나 이상 포함해야 한다

나의 코드는 아래와 같다. 

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

string password = "";
bool vowel = 0;
bool seq = 0;
int vow = 0;
int con = 0;
stack<char> charStack;

bool isVowel(char a) {
    if (a == 97 || a == 101 || a == 105 || a == 111 || a == 117)
        return true;
    else return false;
}


void prejudicePasword(string str) {
    while (charStack.size() != 0)
    {
        charStack.pop();
    }
    vowel = 0; 
    seq = 0;
    con = 0;
    vow = 0;
    charStack.push(str[0]);
    if (isVowel(str[0])) {
        vow = 1;
        vowel = 1;
        seq = 1;
    }
    else con = 1;
    for (int i = 1; i < str.size(); i++) {
        if (isVowel(str[i])) {
            vow++; con = 0;
            vowel = 1;
        }
        else {
            con++; vow = 0;
        }  
        if (vow >= 3) {
            seq = 0;
            break;
        }
        else if (con >= 3) { 
            seq = 0;
         break;
        }
        else seq = 1;

        if (charStack.top() == str[i]) {
            if (str[i] == 'e' || str[i] == 'o') {
                seq = 1;
            }
            else {
                seq = 0; break;
            }
            
        }
        charStack.push(str[i]);
        
   }
}

void print() {
    if (vowel == 1 && seq == 1)
    {
        cout << "<" << password << "> is acceptable" << endl;
    }
    else cout << "<" << password << "> is not acceptable" << endl;
}

int main() {

    while (password != "end") {
        seq = 0;
        vowel = 0;
        cin >> password;
        if (password == "end") break;
        
        prejudicePasword(password);
        cout << "vowel:" << vowel << "seq:" << seq << endl;
        print();
    }

}

우선 나는 

2가지의 flag를 사용하였다. vowel이라는 모음이 포함되었을 때 참 하나도 포함되지 않았을 때 0의 값을 가져 모음의 존재 여부를 나타내는 플래그

자음이나 모음이 3번 반복되면 0 e나 o를 제외한 문자가 2번 반복되면 0 아닌 경우에는 1로 비밀번호의 유효성을 나타내는 flag seq 이다. 

 

그 후 stack과 int 변수 2개를 사용하여 상태를 판단해주었는데 

판단하는 로직을 살펴보면 우선 charStack에 첫 번째 문자를  push해준다. 그 후 첫 번째 문자가 vowel즉 모음이라면 vowel과 seq플래그 모두 1로 변경해준다. 모두를 변경해주는 이유는 만약 비밀번호가 1자리라면 seq를 1로 변경해주지 않은 한 자리 모음 비밀번호의 경우에도 not acceptable로 판단해버리기 때문이다. 

그 후 for문으로 입력받은 password를 돌면서 자음이 나온 경우 con이라는 변수를 +하고 모음이 나온 경우는 vow라는 변수를 +해주었다. 또한 자음이 나온 경우에는 모음의 연속된 수를 나타내는 변수 vow를 다시 0으로 초기화해주었고 모음이 나온 경우에는 자음의 연속된 수를 나타내는 변수 con을 0으로 초기화 해주었다. 

 

그러면서 계속 연속된 두 문자열이 나오는지 확인하기 위해서 stack에 계속 push를 해주었고 charStack의 top과 새로운 str의 문자가 같은 경우에 이 문자가 e인지 o인지 판단해준 뒤 e나 o가 아니라면 seq플래그를 0으로 만들어준 후 반복문을 종료하였다. 

 

결과는 다음과 같다. 

출력은 다음과 같이 나와야한다. 

위 코드대로 작성하면 다음과 같이 정상적으로 동일한 결과를 출력하는 것을 확인할 수 있다. 

 

728x90
반응형

댓글