[Algorithm] 프로그래머스 : 신고 결과 받기

ZEDY·2024년 3월 22일
0

문제

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

풀이

내가 생각한 알고리즘

  1. id_list에 있는 각 사용자를 키로 가지고 있는 딕셔너리 list_1을 생성합니다. 이 딕셔너리는 각 사용자가 받은 신고를 추적하기 위한 용도입니다. 각 사용자는 신고된 사용자의 집합을 가지고 있습니다.
  2. 각 사용자가 받은 신고를 list_1에 업데이트합니다. 각각의 신고는 해당 사용자를 키로 가지는 딕셔너리의 값에 있는 집합에 추가됩니다.
  3. cnt_list 딕셔너리를 생성하여 각 사용자가 받은 신고의 수를 추적합니다. 이 딕셔너리는 모든 사용자에 대해 초기값이 0으로 설정됩니다.
  4. 각 사용자가 신고를 받은 횟수를 확인하고, 만약 해당 횟수가 k 이상이라면 해당 사용자를 신고한 모든 사용자에 대해 신고 횟수를 증가시킵니다.
  5. 마지막으로, 각 사용자의 최종 신고 횟수를 반환합니다.

이 알고리즘은 사용자가 신고를 받은 횟수를 효율적으로 추적하고, 신고 횟수가 일정 값 이상인 경우에 대해서만 처리하는 방식으로 동작합니다. 따라서 입력 데이터가 크더라도 효율적으로 작동할 수 있습니다.

코드 구현

def solution(id_list, report, k):
    answer = [[] for _ in range(len(id_list))]
    
    list_1 = {id_: set() for id_ in id_list}  
    cnt_list = {id_: 0 for id_ in id_list}  
    
    for i in range(0, len(report)):
        f, t = report[i].split(' ')
        list_1[t].add(f)
    print(list_1)
    for i in range(0, len(id_list)):
        one = id_list[i]
        num = len(list_1[one])
        
        if k <= num:
            for c in list_1[one]:
                cnt_list[c] += 1
    
    return list(cnt_list.values())
print(solution(["muzi", "frodo", "apeach", "neo"], ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"], 2))
print(solution(["con", "ryan"], ["ryan con", "ryan con", "ryan con", "ryan con"], 3))

Lesson Learn

  1. 딕셔너리 초기화 하는 방법
list_1 = {id_: set() for id_ in id_list}
cnt_list = {id_: 0 for id_ in id_list}

키값으로 검색했을때 value를 빠르게 얻기 위해서 딕셔너리를 활용하였다.

  1. 딕셔너리를 값들만 얻어서 리스트로 만들기
return list(cnt_list.values())

초기화 하는 거는 항상 헤매는거 같당...ㅠㅠ

profile
Spring Boot 백엔드 주니어 개발자

0개의 댓글