-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
20-jung0115 #180
base: main
Are you sure you want to change the base?
20-jung0115 #180
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 문제는 불량 아이디를 정규식으로 바꾸는 것과 가능한 아이디의 모든 경우를 찾는 것이 핵심 아이디어인 것 같습니다. 이 아이디어를 떠올리기까지 많은 시간이 걸렸는데 정미님의 친절한 수도코드와 다른 분들의 풀이를 참고하여 코드를 작성해나갔습니다!
import re
from itertools import permutations
def solution(user_id, banned_id):
banned_patterns = [b.replace("*", ".") for b in banned_id]
unique_matches = set()
for users in permutations(user_id, len(banned_id)):
if all(re.fullmatch(pattern, user) for pattern, user in zip(banned_patterns, users)):
unique_matches.add(tuple(sorted(users)))
return len(unique_matches)
저는 응모자 아이디의 모든 순열을 탐색하여 각 순열이 불량 사용자의 패턴과 길이를 정확히 만족하는지 검사하고, 조건을 만족하는 경우 중복이 없도록 결과에 추가하고, 최종적으로 고유한 조합의 개수를 반환하였습니다.
코드를 하나하나 참고하면서 따라 작성해보니까 확실히 이해하게 되었네요!
이번 PR도 수고하셨습니다😆
➡️ 풀이 코드
🔗 문제 링크
프로그래머스 | 백트래킹 - 불량 사용자(Lv.3)
✔️ 소요된 시간
1시간 20분
✨ 수도 코드
처음에는 불량 사용자 아이디 목록에 매칭되는 응모자 아이디를 각각 구한 다음 그 수를 이용해서 경우의 수를 구하려고 했습니다
예를 들어 불량 아이디에 매칭되는 응모자가 1번에 3명, 2번에 2명이라면
3 * 2 = 6
으로 해서 총 6가지 경우의 수가 가능하다고 생각했는데, 각 불량 아이디에 중복해서 해당되는 응모자가 있을 수 있기 때문에 이 방법으로는 구할 수 없었습니다예제 기준으로 불량 아이디가
frod*
,fr*do
일 경우,frodo
는 둘 모두에 해당되기 때문에 처음 생각한 방식으로 하면 두 불량 아이디에 같은 응모자가 매칭되는 경우도 세어버리므로 정답이 아니게 됩니다고민하다가 중복이 안 되게끔 경우의 수를 구하기 위해 Set을 이용했습니다!
우선 각 불량 아이디마다 응모자를 매칭해서 Set에 넣고,
결과로 나온 조합까지 Set에서 관리를 해서
하나의 경우의 수 안에서의 중복도 없고, 각 조합 경우의 수끼리도 중복이 없게 했습니다
1. 불량 아이디에 매칭되는 응모자인지 검사
2. 불량 아이디마다 매칭되는 응모자 리스트 관리
3. 조합 만들기
위 단계를 거쳐서 정답을 구해낼 수 있었습니다!!
✅ 최종 코드
📚 새롭게 알게된 내용