새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

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

by 언호 2022. 2. 16.

📖 문제


🧑🏻‍💻 풀이 과정

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

 

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

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

programmers.co.kr

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

댓글