본문 바로가기

프로그래머스 퀴즈(Python)/level 3

23.03.16 파이썬 코딩 퀴즈#199 불량 사용자 (프로그래머스 스쿨)

이번 문제는 불량 사용자 문제이다.

게임 설명에서 나타나듯이 2019 카카오 개발자 겨울 인턴십 문제이다...

위 설명과 같이 총 2개의 리스트를 전달 받는데 하나는 당첨자의 id가 담긴 user_id, 하나는 불량 아이디 목록이 담긴 banned_id 이다.

즉 불량 사용자 아이디 하나당 하나의 응모자 아이디를 불량 사용자로 설정 가능하다.

만약 전달받은 아이디가 [a, b, c, dd] 이고 불량 사용자[*] 이라면 아이디가 한 글자인 사용자 중 한명을 선정하여 불량으로 처리하며, 이때 불량으로 처리 가능한 방법은 [a], [b], [c] 총 3가지가 된다.

입출력 2번을 먼저 살펴보면

*rodo가 2번 나온다, 그리고 *frodo 로 제재 가능한 아이디는 frodo 오 crodo 이다. 

그리고 ****** 은 user_id의 길이가 6인 아이는 제재 가능하다.

따라서 제재 가능한 아이디 조합은 [frodo, crodo, abc123] 또는 [frodo,crodo,frodoc] 이다.

이제 코드를 작성해보자

permutations()을 사용한 이유는 추출한 제재 가능한 아이디를 순서에 맞춰서 뽑기 위함이다.

먼저 3중 반복문을 통해 user_id 와 banned_id 를 비교하여 제재 가능한 아이디를 추출해 준다.

이때 dic[] 에는 각banned_id[index]  에 맞춰서 제재 가능한 아이디가 2차원 배열로 저장된다.

 즉 dic[1] 에는 banned_id[1]이 제재 가능한 아이디들이 저장된다.

추출한 comb는 set()을 이용하여 중복값들을 제거해 주었다.

그리고 permutations 를 이용해 comb 에서 len(dic)만큼의 개수들을 조합한 순열을 생성한 다음,

이 순열을 다시 반복문으로 돌면서 해당 순열[i] 가 dic[i] 에 포함되어 있는 경우에만 올바른 조합법으로 간주한다.

break를 거치지 않고 완주한 list_comb는 다시 else문을 통과하는데, 튜플형태의 list_comb 를 분리하여 집합으로 바꾸어 준다.

그렇게 생성된 n_list 를 temp 에 넣어주는데, 만약 중복값이 존재한다면 건너띄면 된다.

그리고 최종적으로 temp 의 길이가 제재 가능한 조합의 총 방법이 된다.