코딩관계론

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

개발/알고리즘

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

개발자_티모 2022. 12. 26. 18:30
반응형

아이디어 도출 방법

user_id가 최대 8개 임으로 조합을 구성해도 8 * 7 * 6이 최대로 나온다. 따라서 permutations을 사용해 나올 수 있는 모든 순열을 구성한다.

 

생성된 조합에서 해당 아이디가 banned_id에 대응되는지 확인한 후 중복을 확인한 후 list에 넣어주면 된다.

 

중복을 확인하(순서가 상관없기 때문임) 위해서 순열에서 만든 후보 리스트를 set으로 변환하면 리스트가 정렬된 형식으로 나오게 된다. 예를 들면 (c, d, a) -> set(a, b, c)의 형식이 된다. 따라서 후보 값들의 중복을 제거할 수 있다.

최종 결과

from itertools import permutations

def validate(user, ban):
    if len(user) != len(ban):
        return False
    else:
        for i, j in zip(user, ban):
            if j == '*':
                continue
            if i != j:
                return False
        return True


def solution(user_ids, banned_id):
    answer = []
    
    for i in permutations(user_ids, len(banned_id)):
        is_banned = True

        for user_id, ban_id in zip(i, banned_id):
            if not validate(user_id, ban_id):
                is_banned = False

        if is_banned:
            if not set(i) in answer:
                answer.append(set(i))


    return len(answer)


if __name__ == "__main__":
    user_id = 	["frodo", "fradi", "crodo", "abc123", "frodoc"]
    ban_id = ["*rodo", "*rodo", "******"]

    print(solution(user_id, ban_id) == 2)

 

후기

처음에는 ban_id에 적합한 후보키들을 찾아서 dfs형식으로 풀어나갔다. 하지만 문제가 발생했다. 중복을 제거하려면 코드가 엉성해진다는 것이었다. 따라서 사람들은 어떻게 해결했나 참고했더니 아래와 같은 깔끔한 풀이가 존재했다. 위 풀이도 아래의 풀이와 유사한데 이는 아래의 코드를 참고해 구현했기 때문이다. 

https://bladejun.tistory.com/49

반응형