Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 강력한 암호 검사기

<시간/>

문자열, 암호가 있다고 가정합니다. 암호를 강력하게 만드는 데 필요한 최소한의 변경 사항을 찾아야 합니다. 따라서 비밀번호에는 다음과 같은 몇 가지 기준이 있습니다 -

  • 최소 6자, 최대 20자
  • 최소 1개의 소문자, 1개의 대문자, 1개 이상의 숫자를 포함해야 합니다.
  • …aaa…, …PPP…, …888…

따라서 입력이 "aa26bbb"와 같으면 대문자가 없고 연속으로 3개의 b가 있으므로 적어도 하나의 변경이 필요하므로 b를 하나의 대문자로 바꿔 강력하게 만들 수 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • missingTypes 설정 :=3.
  • 소문자가 하나 이상 있는 경우 missingTypes를 1 감소
  • 대문자가 하나 이상 있으면 missingTypes를 1 감소
  • 숫자가 하나 이상 있으면 missingTypes를 1 감소
  • 변경 :=0, 하나 :=0 및 둘 :=0, p :=2
  • p
  • s[p]가 s[p – 1]과 같고 이것도 s[p – 2]와 같으면
    • 길이:=2
    • p
    • 길이 :=길이 + 1
    • p :=p + 1
  • 변경 :=변경 + 길이 / 3
  • 길이가 3의 배수이면 1씩 증가
  • 그렇지 않으면 길이가 3의 배수이면 2를 1로 늘립니다.
  • 그렇지 않으면 p를 1만큼 증가
  • 크기가 s <6이면 최대 missing_type 및 6 - s 크기를 반환합니다.
  • 그렇지 않으면 크기가 s <20이면 missing_type의 최대값을 반환하고 변경합니다.
  • 그렇지 않으면
    • 삭제 :=s – 20의 크기
    • change :=change – 최소 삭제 및 하나
    • 변경 :=변경 – (최소(최대 삭제 – 1 및 0) 및 2 * 2)/2
    • 변경 :=변경 – (최대 삭제 – 1 – 2 * 2 및 0)/2
  • return delete + maximum of missing_type 및 change
  • 이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    class Solution(object):
       def strongPasswordChecker(self, s):
          missing_type = 3
          if any('a' <= c <= 'z' for c in s): missing_type -= 1
          if any('A' <= c <= 'Z' for c in s): missing_type -= 1
          if any(c.isdigit() for c in s): missing_type -= 1
          change = 0
          one = two = 0
          p = 2
          while p < len(s):
             if s[p] == s[p-1] == s[p-2]:
                length = 2
                while p < len(s) and s[p] == s[p-1]:
                   length += 1
                   p += 1
                change += length / 3
                if length % 3 == 0: one += 1
                elif length % 3 == 1: two += 1
             else:
                p += 1
          if len(s) < 6:
             return max(missing_type, 6 - len(s))
          elif len(s) <= 20:
             return max(missing_type, change)
          else:
             delete = len(s) - 20
             change -= min(delete, one)
             change -= min(max(delete - one, 0), two * 2) / 2
             change -= max(delete - one - 2 * two, 0) / 3
             return delete + max(missing_type, change)
    ob = Solution()
    print(ob.strongPasswordChecker('aa26bbb'))

    입력

    “aa26bbb”

    출력

    1