문제
문제 해석
Gooli라는 회사에서 새로운 정책으로 인해 직원들의 계정 비밀번호를 아래 조건과 같이 변경해야 한다는 내용이다.
핵심은 아래와 같다
문제 풀이
생각보다 상당히 간단하게 구현이 가능하다. 순서만 제대로 생각하면 된다.
1. 먼저 입력받은 문자열이 조건을 만족하는지 체크한다.
re_ch, re_up, re_lo, re_di, re_sp (Boolean)
에 표시한다True
, 만족하지 않으면 False
이를 구현한 코드는 아래와 같다.
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번 문제는 생각보다 어렵지 않았다. 시간복잡도도 크게 문제가 되지 않아 쉽게 해결이 가능했다. 이런 문제는 최대한 빨리 푸는 것이 중요한 것 같다. 다음에는 시간을 좀 더 단축하도록 노력해야겠다.