티스토리 뷰

프로그래머스 '불량 사용자' 문제 풀이입니다.

 

문제 링크

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

 

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

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

programmers.co.kr

● 문제 간단 설명

 응모자 아이디 배열과 불량 사용자 아이디 목록을 전달받아, 불량 사용자로 매핑되어 제외되어야 하는 아이디 목록을 뽑아내는 문제입니다.

예를 들어, 이벤트에 응모한 전체 사용자 아이디 목록이 다음과 같다면

응모자 아이디

frodo
fradi
crodo
abc123
frodoc

다음과 같이 불량 사용자 아이디 목록이 전달된 경우,

불량 사용자

fr*d*
abc1**

불량 사용자에 매핑되어 당첨에서 제외되어야 야 할 제재 아이디 목록은 다음과 같이 두 가지 경우가 있을 수 있습니다.

제재 아이디

frodo
abc123

제재 아이디

abc123
fradi

이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은 몇 가지 경우의 수가 가능한 지 return 하도록 solution 함수를 완성하는 문제입니다.

 

● 문제 해결 방향

 

 

● 문제 해결 코드

from collections import Counter
from itertools import permutations

def matchWord (user_id, banned_id): # 밴 아이디와 사용자 아이디가 매치되는지 확인
    for index in range(len(user_id)):
        if (banned_id[index] != '*') and (user_id[index] != banned_id[index]):
            return False
    return True

def match(user_group, banned_id): # 밴 아이디배열과 사용자 아이디배열이 일치하는지 확인
    for index in range(len(user_group)):
        if len(user_group[index]) != len(banned_id[index]) : return False
        else :
            if not matchWord(user_group[index], banned_id[index]): return False
            
    return True
        
def solution(user_id, banned_id):
    answer = 0
    user_groups = list(permutations(user_id, len(banned_id))) # 밴 아이디 배열고 길이기 같은 사용자 아이디의 모든 조합을 출력
    
    match_group = []
    for user_group in user_groups: # 각 사용자 아이디 배열과 밴 아이디 배열을 비교
        if match(user_group, banned_id) and (len(user_group) == len(set(user_group))):
            if set(user_group) not in match_group : match_group.append(set(user_group)) # 일치하는 배열들 내 중복된 아이디가 있는지 확인
        

    return len(match_group)

matchWord() : 밴 아이디와 사용자 아이디의 길이와 각 철자가 일치하는지 확인하는 함수.

match() : 밴 아이디 배열과 사용자 아이디 배열의 요소가 1 대 1로 비교했을 때 일치하는지 확인하는 함수.

 

Solution() :

user_id로 만들 수 있는 밴 아이디와 같은 길이의 배열을 permutations를 활용하여 모두 만들어 낸 뒤,

위에서 만들어 놓은 matchWord(), match() 함수를 활용하여

밴 아이디 배열과 사용자 아이디 조합 배열이 일치하는지 확인했습니다.

 

일치하더라도 같은 사용자가 다른 밴 아이디 형식으로 두 번 검색될 수 있기 때문에

중복을 제거하기 위해 set함수를 활용하여 중복을 제거하였습니다.

 

처음에는 밴 아이디 유형에 따라 검색될 수 있는 아이디를 딕셔너리 형식으로 저장한 후에

그 아이디들을 조합하는 방식을 사용했습니다. 

 

결과는 테스트 케이스에는 모두 정답이라고 나왔지만, 채점 시에 몇 가지 실패로 나오는 부분이 있어

전체 사용자 아이디 조합을 구한 후 조건을 만족하는 조합을 찾아내는 방식으로 순서를 바꾸었습니다.

 

 

● 알게 된 것

itertools 라이브러리의 permutations 함수를 사용했는데

다른 문제를 풀 때도 자주 사용했던 함수라 손에 익혀야겠다는 생각을 했습니다.

 

 

이상 프로그래머스 '불량 사용자' 문제 풀이였습니다.

더 좋은 풀이나 설명이 잘못된 부분이 있으면 알려주세요!

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함