불량사용자
2019 카카오 개발자 겨울 인턴십
Level 3
응모자가 아래와 같이 있고, 불량으로 응모한 아이디가 있다. 이를 걸르기 위해 불량아이디인 경우를 모두 뽑아내라.
응모자 아이디 | 불량 사용자 |
frodo | fr*d* |
fradi | abc1** |
crodo | |
abc123 | |
frodoc |
제재 아이디 경우1 | 제재 아이디 경우2 |
frodo | fradi |
abc123 | abc123 |
Retrun 값은 2가 된다.
입력은 배열의 형태로 주어진다.
["frodo", "fradi", "crodo", "abc123", "frodoc"]
["fr*d*", "abc1**"]
Permutations를 사용하여 푼다.
1. 사용자 아이디의 조합을 불량 사용자 인원의 수 만큼 조합을 만들어낸다.
2. 이러한 조합에서 각 조합을 check()함수를 통해서 문자열 하나하나 조건이 맞는지 반복문을 돌려준다.
3. 조건이 다 맞은 아이디 조합의 경우 answer에 추가해준다. (set()을 사용하여 중복을 제거 해준다.)
4. 마지막으로 answer의 길이를 뽑아내면 모든 경우의 수가 된다.
rom itertools import permutations as pm
user = ["frodo", "fradi", "crodo", "abc123", "frodoc"]
bann = ["fr*d*", "*rodo", "******", "******"]
def check(kind, bann):
for i in range(len(kind)):
if len(kind[i]) != len(bann[i]): # 아이디 조합의 길이가 다른면 바로 False
return False
for j in range(len(kind[i])): # 각 아이디의 글자를 비교
if bann[i][j] == '*': # *부분은 아무 거나 와도 상관없으므로 통과
continue
elif bann[i][j] != kind[i][j]: # 글자가 다른것이 있으면 바로 False
return False
return True
def solution(user, bann):
answer = []
kinds = list(pm(user, len(bann)))
# print(kinds)
for i in kinds:
if check(i, bann): # 아이디 조합별로 글자를 비교하여 통과된 경우 해당 아이디 조합을 사용
i = set(i) # set으로 변경 - 중복 제거
if i not in answer:
print('------')
print(i)
answer.append(i)
print('answer:', answer)
return len(answer)
print(solution(user, bann))
728x90
반응형
'Algorithm > Algorithm' 카테고리의 다른 글
Undirected Graph Adjacency List, Matrix:: 무 방향 그래프, 인접 목록, 행렬 (0) | 2021.05.12 |
---|---|
Binary Search 이진 탐색 이분 탐색 (0) | 2021.05.06 |
🧩 코딩 테스트 정복기 @21#B*06 (0) | 2021.02.18 |