비트를 쪼개는 개발자

allen321@naver.com

코딩테스트

C# [HackerRank] Algorithm(String) - Strong Password

MozarTnT 2024. 9. 6. 18:40
728x90
반응형

 

 

 

 

 

 

 

 

문제 설명

 

Louise라는 친구가 SNS 사이트에 가입하면서 설정하는 비밀번호에 관한 문제다.

 

다만 비밀번호를 설정할때 몇 가지의 제한사항이 있는데, 이 제한사항을 만족하는 비밀번호를 만들어야 한다.

 

각 조건은 다음과 같다.

 

 

  • 비밀번호의 길이가 최소 6자 이상이어야 함.
  • 최소 하나의 숫자가 포함되어 있어야 함
  • 최소 하나의 소문자 영어 문자가 포함되어 있어야 함
  • 최소 하나의 대문자 영어 문자가 포함되어 있어야 함
  • 최소 하나의 특수문자가 포함되어 있어야 함 (특수문자는 "!@#$%^&*()-+")

 

 

해당 조건을 충족하지 않는다면 조건을 충족해야 하는 최소한의 문자의 갯수를 return 해야 한다. 

 

Sample 예시를 살펴보면 문자의 길이는 3이며, String은 "Ab1"로 구성된다.

 

일단 문자에 포함되야 하는 유형은 특수문자만 추가로 포함되면 되고, 최소 6자리의 숫자로 만들면 된다.

 

따라서 아무 특수문자를 하나 추가하는 조건으로 count를 ++ 해주고 (현재 비밀번호는 4자리)

 

이후의 최소 6자리의 비밀번호를 만족하기 위해 문자 2개를 추가해주면 (현재 비밀번호는 6자리)

 

조건을 만족하게 되고 count는 총 3을 return하게 된다.

 

 

 

해당 코드

 

public static int minimumNumber(int n, string password)
{
    // 필요한 문자 종류
    string numbers = "0123456789";
    string lower_case = "abcdefghijklmnopqrstuvwxyz";
    string upper_case = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string special_characters = "!@#$%^&*()-+";

    // 각 조건 검사
    bool isNumber = false;
    bool isLower = false;
    bool isUpper = false;
    bool isSpecial = false;

    // 비밀번호가 조건을 충족하는지 검사
    for (int i = 0; i < password.Length; i++)
    {
        char c = password[i];

        if (numbers.Contains(c))
        {
            isNumber = true;
        }
        else if (lower_case.Contains(c))
        {
            isLower = true;
        }
        else if (upper_case.Contains(c))
        {
            isUpper = true;
        }
        else if (special_characters.Contains(c))
        {
            isSpecial = true;
        }
    }

    // 부족한 조건 계산
    int missingCount = 0;

    if (!isNumber)
    {
        missingCount++;
    }
    if (!isLower)
    {
        missingCount++; 
    }
    if (!isUpper)
    {
        missingCount++;
    }
    if (!isSpecial)
    {
        missingCount++;
    }


    // 비밀번호 길이가 6자 미만이면
    int minLength = 0;

    if (n < 6)
    {
        minLength = 6 - n;
    }

    // 추가해야 할 문자 수는 부족한 조건의 개수와 최소 길이 요구사항 중 더 큰 값을 return
    if (missingCount > minLength)
    {
        return missingCount;
    }
    else
    {
        return minLength;
    }


}

 

 

풀이 방법

 

사실 조건문을 검사하는 과정이 필수적이라 코드가 길어진 감이 있는데 조금 더 생각해보면 짧은 코드로도 구현이 가능할 것 같다.

 

아무튼 풀이 방법을 살펴보면 

 

먼저 조건에 부합하는 각각의 문자와 해당 조건을 검사할 자료형을 각각 만들어준다.

 

 

그리고 password로 넘겨받은 문자를 해당 문자의 길이 만큼 반복문을 돌려 조건을 충족하는지 검사하고 

 

조건을 충족한다면 해당 bool값을 true로 변경시킨다.

 

모든 문자를 검사한 후에는 부족한 조건 만큼 int로 만든 missingCount 값을 ++ 해준다.

 

만약 글자의 길이가 6글자 보다 작은 상태라면 모자란 문자의 길이가 missingCount의 값 보다 작은지 검사 하고, 둘 중 높은 값을 반환하면 된다.

 

*** 예를 들어 aaaaa 같은 비밀번호의 경우 길이만 검사할 경우에는 한자리가 모자라지만 추가로 충족해야 할 조건의 문자가 (대문자, 특수문자, 숫자) 총 3자리가 더 필요하다. 따라서 6자리만 만족하는 조건인지 아니면 missingCount에서 통과하지 못한 조건인지 한번 더 꼭 검사해야 한다

 

.

 

728x90
반응형