[Google Kick Start 2022][Python/파이썬] Round C 1번 New Password

Kim Tae Won·2022년 5월 28일
0
post-thumbnail
post-custom-banner

Google Kick Start 2022 Round C 1번 New Password

문제

문제 해석

Gooli라는 회사에서 새로운 정책으로 인해 직원들의 계정 비밀번호를 아래 조건과 같이 변경해야 한다는 내용이다.

  1. 최소 7개의 글자
  2. 최소 하나 이상의 대문자 포함하기
  3. 최소 하나 이상의 소문자 포함하기
  4. 최소 하나 이상의 숫자 포함하기
  5. 최소 하나 이상의 특수문자 포함하기(4개의 특수문자 : #, @, *, and &)

핵심은 아래와 같다

  • 이미 조건들을 모두 만족한다면 변경할 필요가 없다.
  • 조건을 만족하지 않는다면, 현재 비밀번호에 부족한 조건에 맞는 최소한의 문자를 이어붙여서 조건에 만족하도록 만든다.

문제 풀이

생각보다 상당히 간단하게 구현이 가능하다. 순서만 제대로 생각하면 된다.
1. 먼저 입력받은 문자열이 조건을 만족하는지 체크한다.

  • re_ch, re_up, re_lo, re_di, re_sp (Boolean)에 표시한다
  • 만족하면 True, 만족하지 않으면 False
  1. 조건에 맞지 않는 것들을 조건에 충족하도록 문자열에 추가한다.

이를 구현한 코드는 아래와 같다.

import random
import string

def checkMissedRequirements(password, n):
    re_ch = False
    re_up = False
    re_lo = False
    re_di = False
    re_sp = False
    if n < 7:
        re_ch = False
    else:
        re_ch = True
    for ch in password:
        # 문자라면,
        if ch.isalpha():
            # 대문자 있는지
            if not re_up and ch.isupper():
                re_up = True
            # 소문자 있는지
            if not re_lo and ch.islower():
                re_lo = True
        # 숫자 있는지
        elif not re_di and ch.isdigit():
            re_di = True
        # 특수문자(#, @, *, &) 있는지
        elif not re_sp and (ch == '#' or ch == '@' or ch == '*' or ch == '&'):
            re_sp = True
        if re_ch and re_up and re_lo and re_di and re_sp:
            break
    return ([re_ch, n], re_up, re_lo, re_di, re_sp)

def correctPass(password, re_miss_lists):
    if re_miss_lists[1] == False:
        password += random.choice(string.ascii_letters).upper()
        re_miss_lists[0][1] += 1
    if re_miss_lists[2] == False:
        password += random.choice(string.ascii_letters).lower()
        re_miss_lists[0][1] += 1
    if re_miss_lists[3] == False:
        password += str(random.randint(0, 9))
        re_miss_lists[0][1] += 1
    if re_miss_lists[4] == False:
        password += random.choice(['#', '@', '*', '&'])
        re_miss_lists[0][1] += 1
    if re_miss_lists[0][0] == False:
        for i in range(max(7 - re_miss_lists[0][1], 0)):
            password += random.choice(string.ascii_letters)
    return password

def checkAndCorrectPass(password, n):
    re_miss_lists = checkMissedRequirements(password, n)
    new_password = correctPass(password, re_miss_lists)
    return new_password

# T : the number of test cases
T = int(input())
answers = []

for i in range(T):
    # N : the length of the old password.
    # Old password contains only digits, 
    # letters, and special characters.
    N = int(input())
    old_pw = input()
    answers.append(checkAndCorrectPass(old_pw, N))
for i in range(T):
    print("Case #{}: {}".format(i + 1, answers[i]))

결론

실행 결과

소감

1번 문제는 생각보다 어렵지 않았다. 시간복잡도도 크게 문제가 되지 않아 쉽게 해결이 가능했다. 이런 문제는 최대한 빨리 푸는 것이 중요한 것 같다. 다음에는 시간을 좀 더 단축하도록 노력해야겠다.

profile
꿈이 너무나 큰 평범한 컴공 대딩에서 취업 성공!
post-custom-banner

0개의 댓글