📖 문제
🧑🏻💻 풀이 과정
1) 문제 이해 및 접근
불량 사용자를 응모자 아이디와 비교하여 제재 가능한 아이디 목록을 만들어 주었습니다.
이때 좀 더 빠른 탐색을 위해, 응모자 아이디를 길이순, 알파벳순으로 정렬하여 앞에서 탐색하였고, 길이를 초과하면 탐색을 멈추도록 하였습니다.
재귀를 이용하여 제재 아이디를 만들 수 있는 경우를 구해주었습니다.
2) 알고리즘
- 문자열
3) 풀이 코드
사용 언어 - Python
def solution(user_id, banned_id):
answer = set() # 제재 아이디 가능한 경우들 집합
user_id = list(sorted(user_id, key=lambda x: (len(x), x))) # 유저 아이디를 길이순, 알파벳순으로 정렬
cases = [[] for _ in range(len(banned_id))] # 불량 사용자별 가능한 유저 아이디 경우
for ban_idx in range(len(banned_id)): # 불량 유저 아이디를 하나씩 탐색
banned = banned_id[ban_idx]
L = len(banned)
for user in user_id: # 유저 아이디 앞에서 부터 탐색
if len(user) == L: # 유저 아이디가 불량 유저 아이디와 길이가 같을때
idx = 0
while idx < L: # 해당 유저가 제재 가능한 경우에, cases 리스트에 각 인덱스별로 추가
if banned[idx] != user[idx] and banned[idx] != '*':
break
idx += 1
else:
cases[ban_idx].append(user)
elif len(user) > L: # 유저 아이디의 길이가 길면 이후 유저 아이디 탐색 종료
break
def comb(n, ans): # 제재 아이디 가능한 조합 탐색
if n >= len(banned_id):
answer.add(tuple(sorted(ans))) # 제재 가능한 경우 추가
return
for k in range(len(cases[n])): # cases 의 각 요소들의 길이만큼 반복
if cases[n][k] not in ans: # 같은 이름이 없는 경우에만 추가하며, 재귀 탐색
comb(n+1, ans+[cases[n][k]])
comb(0, [])
return len(answer)
📝 결과 및 학습한 내용
1) 어려웠던 내용
특별히 없습니다.
2) 새롭게 학습한 내용
특별히 없습니다.
🔗 문제 링크
- https://programmers.co.kr/learn/courses/30/lessons/64064
※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
[프로그래머스] 추석 트래픽 (0) | 2022.02.18 |
---|---|
[프로그래머스] 표 편집 (0) | 2022.02.17 |
[프로그래머스] 보석 쇼핑 (0) | 2022.02.15 |
[프로그래머스] 자물쇠와 열쇠 (0) | 2022.02.14 |
[프로그래머스] 길 찾기 게임 (0) | 2022.02.13 |
댓글