반응형
programmers.co.kr/learn/courses/30/lessons/64064
코딩테스트 연습 - 불량 사용자
개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량
programmers.co.kr
해결 방법 : 모든 경우의 수 탐색
- user_id에 대해 banned_id 수로 조합을 만든다. (불량 사용자 리스트에 매칭될 수 있는 '중복 없는' 경우들)
- 위에서 만든 case들과 banned_id리스트가 일치 될 수 있는지 확인
- 이 때, 그리디하게 순차적으로 접근하며 매칭을 단정지으면 안된다.
- ex) case = ['aaa', 'bbb', 'aac'], banned_id = ['aa*', 'bb*', '*aa'] // 이 예시는 case가 불량 사용자들로 매칭되야 하는 경우인데 'aaa' → 'aa*' 를 확정 지으면 남은 두개의 id는 매칭이 불가능해진다.
- 결국 case와 banned_id 또한 모든 경우를 탐색하도록 해야한다. → 순열 사용.
- id 간 비교는 is_equal()
from itertools import combinations, permutations
def solution(user_id, banned_id):
answer = 0
cases = combinations(user_id, len(banned_id))
for case in cases:
check = False
for c in permutations(case, len(case)):
for i in range(len(case)):
if is_equal(c[i], banned_id[i]) == False: break
if i == len(case) - 1: check = True # 모든 id들이 불량 사용자와 일치
if check: # 불량 사용자 조합으로 확인되면 answer++, 더 이상 비교 X
answer += 1
break
return answer
def is_equal(str1, str2): # id 일치 판별
if len(str1) != len(str2): return False
return len(['unequal' for s1, s2 in zip(str1, str2) if s1 != s2 and s2 != '*']) == 0
이전 풀이와 비교
: 접근 방식은 다르지만 모든 경우를 탐색한다는 점에서는 비슷하다.
하지만 이번 풀이는 조합을 사용하여 매칭 중복 검사를 할 필요가 없다.
반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
호텔 방 배정* (0) | 2021.04.30 |
---|---|
징검다리 건너기* (0) | 2021.04.28 |
===== Programmers level 3, level 4 다시 풀기 시작 ===== (0) | 2021.04.28 |
광고 삽입 (0) | 2021.03.29 |
합승 택시 요금 (0) | 2021.03.23 |