Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 비밀번호 유효성 검사하기: 조건 충족 여부 확인 프로그램

문자열 s가 하나의 비밀번호를 나타낸다고 가정해 봅시다. 이때 해당 비밀번호가 정해진 기준을 모두 충족하는지 확인하는 프로그램을 작성해야 합니다.

비밀번호가 충족해야 할 규칙

  • 비밀번호의 길이는 최소 8자 이상, 최대 20자 이하여야 합니다.
  • 비밀번호에는 최소 한 개의 숫자가 포함되어야 합니다.
  • 비밀번호에는 최소 한 개의 소문자와 최소 한 개의 대문자가 포함되어야 합니다.
  • 비밀번호에는 최소 한 개의 특수문자(예: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~)가 포함되어야 합니다.
  • 비밀번호에는 탭이나 줄바꿈 문자 같은 다른 문자가 포함되어서는 안 됩니다.

예를 들어 입력값이 "@bCd12#4"라면, 위의 모든 조건을 만족하므로 출력 결과는 True가 됩니다.

해결 접근 방법

이 문제는 다음 단계에 따라 해결할 수 있습니다.

  1. 대문자 개수(a), 소문자 개수(b), 특수문자 개수(c), 숫자 개수(d)를 저장할 변수를 각각 0으로 초기화합니다.
  2. 비밀번호 길이가 8자 미만이거나 20자를 초과하면 False를 반환합니다.
  3. 비밀번호의 각 문자를 하나씩 확인합니다.
    • 문자가 대문자라면 a를 1 증가시킵니다.
    • 문자가 소문자라면 b를 1 증가시킵니다.
    • 문자가 허용된 특수문자 집합에 속한다면 c를 1 증가시킵니다.
    • 문자가 숫자라면 d를 1 증가시킵니다.
  4. a, b, c, d가 모두 1 이상이고, 네 값의 합이 비밀번호 전체 길이와 일치한다면 True를 반환합니다. 합계가 길이와 일치하는지 확인하는 이유는, 어떤 문자도 위 네 범주 중 어디에도 속하지 않는 경우(예: 탭, 줄바꿈 등)를 걸러내기 위해서입니다.
  5. 그 외의 경우에는 False를 반환합니다.

구현 예제

class Solution:
    def solve(self, password):
        a = 0
        b = 0
        c = 0
        d = 0
        if len(password) < 8 or len(password) > 20:
            return False
        for i in password:
            if i.isupper():
                a += 1
            elif i.islower():
                b += 1
            elif i in '"!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"':
                c += 1
            elif i.isdigit():
                d += 1
        if a >= 1 and b >= 1 and c >= 1 and d >= 1 \
                and a + b + c + d == len(password):
            return True
        else:
            return False

s = "@bCd12#4"
ob = Solution()
print(ob.solve(s))

입력

"@bCd12#4"

출력

True

코드 설명

위 코드에서는 Python의 내장 문자열 메서드를 활용했습니다. isupper()는 문자가 대문자인지, islower()는 소문자인지, isdigit()은 숫자인지 판별합니다. 특수문자 여부는 허용된 특수문자들을 담은 문자열에 해당 문자가 포함되어 있는지 in 연산자로 검사합니다.

마지막 조건에서 a + b + c + d == len(password)를 확인하는 부분이 핵심입니다. 만약 비밀번호에 탭이나 줄바꿈처럼 네 범주 어디에도 해당하지 않는 문자가 포함되어 있다면, 분류된 문자의 총합이 실제 길이보다 작아지기 때문에 False가 반환됩니다. 이렇게 하면 별도의 추가 검사 없이도 '허용되지 않은 문자 포함' 규칙을 자연스럽게 처리할 수 있습니다.

이 알고리즘은 비밀번호의 각 문자를 한 번씩만 순회하므로 시간 복잡도는 O(n)이며, 공간 복잡도는 O(1)로 매우 효율적입니다.