DHistory

[Programmers] Level 1 - 신고 결과 받기 본문

Computer Science/Algorithm

[Programmers] Level 1 - 신고 결과 받기

ddu0422 2023. 8. 2. 14:39

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 1 (문제 요구사항으로 풀기)

"""
1. 한 번의 한 명의 유저를 신고
  - 신고 횟수 제한 없음
  - 서로 다른 유저를 계속 신고 가능
2. k번 이상 신고된 유저는 게시판 이용이 정지
   해당 유저를 신고한 유저에게 정지 사실을 메일로 발송

== example ==
전체 유자: muzi, frodo, apeach, neo
k(신고 횟수): 2번
유저ID 신고ID
muzi frodo
apeach frodo
frodo neo
muzi nedo
apeach muzi

frodo / neo 2번 신고

## 결과 ##
유저ID   / 신고ID       / 정지ID
muzi    / frodo, nedo / frodo, neo (2)
frodo   / neo         / neo        (1)
apeach  / muzi, frodo / frodo      (1)
neo     / x           / x

각 유저별로 처리 결과 메일을 받은 횟수: [2, 1, 1, 0]
"""

def solution(id_list, report, k):
    answer = []
    
    # 초기화
    reports = {}
    reports_history = {}

    for id in id_list:
        reports.setdefault(id, 0)
        reports_history.setdefault(id, [])

    # 신고
    for data in report:
        reporter, reported = data.split()
        # 이미 신고를 진행한 경우 다시 신고할 수 없음
        if reported in reports_history[reporter]:
            continue
        reports[reported] += 1
        reports_history[reporter].append(reported)

    # 정지 대상자
    block_list = []
    for data in reports.items():
        if data[1] >= k:
            block_list.append(data[0])

    # 신고 대상자 확인
    for data in reports_history.values():
        result = 0
        for reported in data:
            if reported in block_list:
                result += 1
        answer.append(result)

    return answer

 

채점 결과

 

풀이 2 (리팩토링)

def solution_refactoring(id_list, report, k):
    # 이미 신고를 진행한 경우 다시 신고할 수 없음
    report = set(report)
    
    # 초기화
    reports = {id: 0 for id in id_list}
    reports_history = {id: [] for id in id_list}

    # 신고
    for data in report:
        reporter, reported = data.split()
        reports[reported] += 1
        reports_history[reporter].append(reported)

    # 정지 대상자
    block_list = [data[0] for data in reports.items() if data[1] >= k]

    # 신고 대상자 확인
    return [len(set(data) & set(block_list)) for data in reports_history.values()]

 

채점 결과

 

테스트 3, 7, 8, 9, 10, 11, 14, 15, 20, 21의 결과를 살펴보면 "풀이1"보다 "풀이2"의 성능이 더 좋은 걸 알 수 있습니다.