신고 결과 받기

최민수·2023년 3월 23일
0

알고리즘

목록 보기
40/94
from collections import defaultdict

def solution(id_list, report, k):
    answer = [0]*len(id_list)
    reportDict = defaultdict(lambda: 0)
    
    # 신고 사실 취합
    for item in set(report):
        reportDict[item.split(" ")[1]] += 1

    # 알림 내역 발송
    # 정지 유저 판별
    for item in set(report):
        if reportDict[item.split(" ")[1]] >= k:
            answer[id_list.index(item.split(" ")[0])] += 1
    
    return answer

아주 간단한 구현 문제지만, 코드를 간결하고 최적화 하기 위해서는 노력이 필요하다.

예를 들면, 나는 처음 코드를 짤 때 신고자가 몇 번 신고 당했는지의 defaultdict, 그리고 누가 누구를 신고했는지의 또 하나의 defaultdict 를 선언해서 풀었다.

하지만, 그렇게 할 필요없이 문제에서 제공한 report 배열을 set으로 바꿔 iteration 하면, 따로 신고자에 대해서 누가 신고했는지 확인할 것 없이 split 0번째, 1번째를 그대로 사용하면 해결된다.

위의 코드가 개선한 풀이고, 아래 코드가 나의 원래 풀이였다.

한 눈에 봐도 위의 코드가 더 나은 코드다라는 생각이 든다.
문제가 조금만 더 복잡했다면 내 코드는 시간 효율성을 통과 못할 정도는 아니겠지만, 더 느릴 것임은 분명하다.

from collections import defaultdict

def solution(id_list, report, k):
    answer = []
    banned = []
    reportDict = defaultdict(lambda: 0)
    reporters = defaultdict(set)

    # 신고 사실 취합
    for item in report:
        reporter, reportee = item.split(" ")
        if reportee not in reporters[reporter]:
            reportDict[reportee] += 1
        reporters[reporter].add(reportee)

    # 정지 유저 판별
    for item, value in reportDict.items():
        if value >= k:
            banned.append(item)

    # 알림 내역 발송
    for ids in id_list:
        result = 0
        for it in reporters[ids]:
            if it in banned:
                result += 1
        answer.append(result)

    return answer

프로그래머스 연습문제, https://school.programmers.co.kr/learn/challenges

profile
CS, 개발 공부기록 🌱

0개의 댓글