[HackerRank/C++] Strong Password

2023. 2. 8. 09:05코딩테스트 해커랭크/Algorithms -Easy

루이즈는 특정 사이트에 가입하기 위해 비밀번호를 만든다

 

강력한 비밀번호의 조건은 다음과 같다

 

최소 6글자 이상의 비밀번호여야 하며,

 

영문 소문자, 대문자, 숫자, 특수문자를 하나씩 포함해야 한다

 

이때 인자로 받는 문자열 password가 강력한 비밀번호가 되려면 최소 몇개의 문자열이 추가되어야 하는지 return 한다

 

int minimumNumber(int n, string password)
{
    bool num = false;
    bool sma = false;
    bool big = false;
    bool spc = false;
    
    string sWord = "!@#$%^&*()-+";
    
    for (int i = 0; i < password.size(); ++i)
    {
        if (!num && '0' <= password[i] && password[i] <= '9')
            num = true;
        else if (!sma &&'a' <= password[i] && password[i] <= 'z')
            sma = true;
        else if (!big &&'A' <= password[i] && password[i] <= 'Z')
            big = true;
        else if (!spc)
            for (int j = 0; j < sWord.size(); ++j)
                if (password[i] == sWord[j])
                {
                    spc = true;
                    break;
                }
    }
    
    int result = 6 - password.size();
    
    int addWord = 0;
    if (!num)
        ++addWord;
    if (!sma)
        ++addWord;
    if (!big)
        ++addWord;
    if (!spc)
        ++addWord;
    
    return result > addWord ? result : addWord;
}

각 문자열 종류가 존재하는지 확인할 bool 변수 4개를 선언한다

 

원소를 탐색하며 각각 해당 글자가 어느 문자열에 속하는지 확인하고, 각각의 종류라면 해당 종류의 bool 값을 true로 바꾼다

 

if 조건의 맨 처음으로 bool값의 조건을 넣어 이미 존재하는 문자열이라면 뒤의 조건식은 체크하지 않는다

 

숫자, 소문자, 대문자는 ascii 코드값이 순차적으로 배열되어 있기 때문에 크기 비교로 쉽게 확인이 가능하지만 특수문자는 그렇지 않다

 

따라서 string sWord를 선언하고 원소를 해당하는 특수문자로 채운다

 

특수 문자는 해당 문자가 sWord에 있는 문자열과 같은지 비교해 존재하는지 확인한다

 

원소의 탐색이 끝나면 6글자에 몇글자가 부족한지를 먼저 확인하고, 부족한 문자열의 종류가 몇 종류인지 확인한다

 

이 중 더 큰값이 필요한 문자수이므로 해당 값을 return 한다