작성일 :

문제 링크

16944번 - 강력한 비밀번호

설명

주어진 문자열 S가 규칙을 만족하도록 뒤에 추가해야 하는 최소 문자 수를 구하는 문제입니다.


접근법

소문자, 대문자, 숫자, 특수문자 포함 여부를 확인해 부족한 종류 개수를 셉니다.
길이 조건(6 이상)과 부족한 종류 개수 중 큰 값을 답으로 출력합니다.


Code

C#

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
using System;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);
    var s = Console.ReadLine()!;
    var special = "!@#$%^&*()-+";

    var hasLower = false;
    var hasUpper = false;
    var hasDigit = false;
    var hasSpecial = false;

    foreach (var c in s) {
      if (c >= 'a' && c <= 'z') hasLower = true;
      else if (c >= 'A' && c <= 'Z') hasUpper = true;
      else if (c >= '0' && c <= '9') hasDigit = true;
      else if (special.IndexOf(c) >= 0) hasSpecial = true;
    }

    var need = 0;
    if (!hasLower) need++;
    if (!hasUpper) need++;
    if (!hasDigit) need++;
    if (!hasSpecial) need++;

    var add = 6 - n;
    if (add < 0) add = 0;
    Console.WriteLine(Math.Max(need, add));
  }
}

C++

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
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;
  string s; cin >> s;
  string special = "!@#$%^&*()-+";

  bool hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false;
  for (char c : s) {
    if ('a' <= c && c <= 'z') hasLower = true;
    else if ('A' <= c && c <= 'Z') hasUpper = true;
    else if ('0' <= c && c <= '9') hasDigit = true;
    else if (special.find(c) != string::npos) hasSpecial = true;
  }

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

  int add = 6 - n;
  if (add < 0) add = 0;
  cout << max(need, add) << "\n";

  return 0;
}