본문 바로가기

개발/알고리즘

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

대표이미지 - 프로그래머스

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

*2019 카카오 개발자 겨울 인턴십 문제

 

문제 설명

문제 설명 1
문제 설명 2

 

제한 사항

제한 사항

 

입출력 예시

입출력 예시

 

풀이 방법

처음에는 이중 for문으로 banned_id와 user_id를 비교해서 불량사용자 아이디 쌍을 찾은 다음, 조합의 경우의 수를 찾으려고 했다.

입출력 예시 중 첫번째 예시를 예를 들면

0: [frodo, frodi], 1: [abc123]

이런 dictionary를 하나 만들어서 value 값들의 조합의 수를 구하려고 했는데

value 값들의 조합의 수를 구하는게 쉽지 않아서 고민하다가...

 

user_id에서 나올 수 있는 모든 경우를 고려한 다음, banned_id와 매핑 되는 쌍을 남기는 방법으로 변경해서 풀었다.

python의 개념은 itertools의 permutations와 set 자료 구조를 유용하게 사용했다.

 

정답 코드

from itertools import permutations

def check_id(banned_id, combi, answer_set):
    for i in range(len(banned_id)):
        if len(banned_id[i]) != len(combi[i]):
            return False
    
    flag = True
    for i in range(len(banned_id)):
        b_id = banned_id[i]
        c_id = combi[i]
        for j in range(len(b_id)):
            if b_id[j] != c_id[j] and b_id[j] != "*":
                flag = False
                break
    if flag:
        answer_set.add(tuple(sorted(combi)))

def solution(user_id, banned_id):
    answer_set = set()
    
    for combi in permutations(user_id, len(banned_id)):
        check_id(banned_id, list(combi), answer_set)
    
    return len(answer_set)