[BAEKJOON] 백준 16944: 강력한 비밀번호 (C#)

2024. 6. 5. 16:59IT/BaekJoon

문제 링크

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

 

 

문제

큐브러버는 문제가 안 풀릴때 게임을 만들면서 머리속으로 문제를 푸는 법을 생각한다. 드디어 게임이 완성되었고, 이 게임의 이름은 "리듬 테트리스"이다. "리듬 테트리스"는 리듬 게임과 테트리스를 동시에 하는 재미있는 게임이다. 문제에 여백이 부족해 게임을 할 수 있는 사이트의 링크는 생략한다.

리듬 테트리스를 하려면 먼저 회원 가입을 해야 한다. 유저는 이메일과 비밀번호를 입력해야 하고, 비밀번호는 아래 규칙을 지켜야 한다.

  • 비밀번호는 알파벳 소문자, 대문자, 숫자, 특수문자로만 이루어져 있다.
  • 비밀번호는 6글자 이상이어야 한다.
  • 숫자는 하나 이상 포함되어야 한다.
  • 알파벳 소문자는 하나 이상 포함되어야 한다.
  • 알파벳 대문자는 하나 이상 포함되어야 한다.
  • 특수 문자는 하나 이상 포함되어야 한다. 사용할 수 있는 특수 문자는 !@#$%^&*()-+이다.

구사과는 리듬 테트리스를 하기 위해 회원 가입을 하려고 한다. 문자열 S를 비밀번호로 사용하려고 하지만, 리듬 테트리스의 비밀번호 규칙을 지키지 않을 수도 있다.

문자열 S가 주어졌을 때, 리듬 테트리스의 비밀번호 규칙을 지키려면 S의 뒤에 추가해야 하는 글자의 최소 개수를 구해보자.

 

 

입력

첫째 줄에 문자열의 길이 N(1 ≤ N ≤ 100), 둘째 줄에 문자열 S가 주어진다. S는 알파벳 소문자, 대문자, 특수문자(!@#$%^&*()-+), 숫자로만 이루어져 있다.

 

 

출력

첫째 줄에 리듬 테트리스의 비밀번호 규칙을 지키기 위해 추가해야 하는 문자의 최소 개수를 출력한다.

 

 

 

통과한 답안

namespace _16944
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            string input = Console.ReadLine();

            bool hasDigit = false;
            bool hasLower = false;
            bool hasUpper = false;
            bool hasSpecial = false;

            for (int i = 0; i < input.Length; i++)
            {
                if ('0' <= input[i] && input[i] <= '9')
                {
                    hasDigit = true;
                }
                else if ('a' <= input[i] && input[i] <= 'z')
                {
                    hasLower = true;
                }
                else if ('A' <= input[i] && input[i] <= 'Z')
                {
                    hasUpper = true;
                }
                else
                {
                    hasSpecial = true;
                }
            }

            int required = 0;
            if (!hasDigit) required++;
            if (!hasLower) required++;
            if (!hasUpper) required++;
            if (!hasSpecial) required++;

            int totalLength = N + required;
            if (totalLength < 6)
            {
                required += 6 - totalLength;
            }

            Console.WriteLine(required);            
        }
    }
}

 

문자열의 길이와 문자열이 주어졌을 때,

조건에 만족하는 문자열로 만들기 위해서

몇 개의 문자를 추가해야되는지 묻는 문제이다.

1. 6글자 이상

2. 숫자를 포함

3. 알파벳 소문자를 포함

4. 알파벳 대문자를 포함

5. 특수문자 (!@#$%^&*()-+)를 포함

 

따라서 이를 해결하기 위해 문자열을 받아온 후에

해당 문자열의 문자들을 순회하면서 위의 조건에 맞는지를 확인하면 된다. 

이는 bool 값과 for 문, char를 이용하였으며 아래와 같은 방식으로 구현하였다.

if ('0' <= input[i] && input[i] <= '9')
{
    hasDigit = true;
}

 

 

이렇게 모든 문자열에 대해서 조건을 확인한 후에

필요한 없는 조건 만큼 숫자를 더해주고,

마지막으로 새롭게 만들어질 비밀번호가 6글자 이상인지 확인하도록 구현하였다.

 

 

숫자, 소문자, 대문자, 특수문자가 포함되어 있는지 확인할 수 있는 다른 방법으로는

C#의 char 기능을 이용하는 것인데,

string specialCharacters = "!@#$%^&*()-+";

foreach (char c in input)
{
    if (char.IsDigit(c)) hasDigit = true;
    else if (char.IsLower(c)) hasLower = true;
    else if (char.IsUpper(c)) hasUpper = true;
    else if (specialCharacters.Contains(c)) hasSpecial = true;
}

 

위와 같이 char.IsDigit, char.IsLower, char.IsUpper 의 기능을 이용할 수 있고,

또 새롭게 string을 지정한 뒤에 string.Contains(c)를 이용하는 방식으로도 확인할 수 있다.

 

위의 for 문은 확인하려는 조건이 직관적으로 보인다는 장점이 있으며

아래의 foreach 문은 오류를 최소화 시킬 수 있다는 장점이 있다.