여름의 서재

[프로그래머스] 불량 사용자 본문

알고리즘/프로그래머스

[프로그래머스] 불량 사용자

엉아_ 2021. 12. 7. 00:39
728x90

📕 문제

https://programmers.co.kr/learn/courses/30/lessons/64064

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

 

💡 풀이법

1. 불량 사용자의 아이디 하나에서 나올 수 있는 제재 아이디의 리스트를 리턴하는 find라는 함수를 정의했다.

2. 처음 stack에 불량 사용자의 아이디와 길이가 같은 아이디만 넣는다.

3. n = 0 부터 돌면서 사용자의 아이디를 stack에서 pop해서 불량 사용자의 첫번째 글자와 사용자의 첫번째 글자가 같으면 stack에 넣는다.

4. while문을 다 돌고 만들어진 stack을 find_list에 담아준다.

5. 각 불량 사용자의 제재 사용자 리스트에서 하나씩 빼서 제재 사용자 목록을 만드는 make 함수를 정의했다.

6. find_list를 처음 인덱스부터 접근하면서 lst에 없는 id만 lst에 넣고 다시 n을 +1해서 make함수를 실행한다.

7. 모든 find_list의 원소를 다 돌면 result에 lst를 추가해준다.

def solution(user_id, banned_id):
    def find(bad_id):
        stack = list(filter(lambda x: len(x) == len(bad_id), user_id))
        n = 0
        while n < len(bad_id):
            if bad_id[n] == '*':
                n += 1
                continue
            c = len(stack)
            for _ in range(c):
                id = stack.pop(0)
                if id[n] == bad_id[n]:
                    stack.append(id)
            n += 1
        return stack
    
    def make(lst, n):
        nonlocal result

        if n == len(banned_id):
            result.append(''.join(sorted(lst)))
            return
        
        for id in find_list[n]:
            if not id in lst:
                make(lst+[id], n+1)
                
    find_list = []
    for bad_id in banned_id:
        find_list.append(find(bad_id))

    result = []
    make([], 0)
    return len(set(result))

 

Comments