본문 바로가기
알고리즘 풀이

[알고리즘] 프로그래머스 | 신고 결과 받기

by 째깍단 2023. 8. 26.

신고 결과 받기

답: 

더보기
def solution(id_list, report, k):
    result = {}
    reported_log = {}
    stop = []
    answer = [0] * len(id_list)
    
    # 중복값 삭제 및 정렬
    report = sorted(list(set(report)))

    # result 신고횟수 셀 dict생성
    for i in id_list:
        result[i] = 0

    # reported_log 신고한 유저 key, 신고당한 user는 value list로 추가
    for r in report:
        user_id, reported_id = r.split(" ")
        # print(user_id, reported_id)
        if not user_id in reported_log:
            reported_log[user_id] = []
        reported_log[user_id].append(reported_id)
    # print(reported_log)
    
    # 신고된 횟수 및 정지여부 확인
    for r in report:
        reported_id = r.split(" ")[1]
        result[reported_id] += 1
        # reported_id가 정지횟수를 넘으면 append ##여러번 들어갈 우려가 있음
        if result[reported_id] >= k:
            stop.append(reported_id)
        
        
    # reported_log 신고한 유저 key, 신고당한 user는 value list, 
    # list에 있는 stop을 확인하고 key값으로 answer에 추가
    stop = set(stop)
    for key in reported_log:
        for s in stop:
            if s in reported_log[key]:
                index = id_list.index(key)
                answer[index] += 1
        
    return answer

 

 

문제 분석 및 해석

문제가 길어서 제한 조건에 따라 문제를 잘라서 풀이해야겠다고 생각했다.

 

 

제한조건 1

각 유저는 한 번에 한 명의 유저를 신고 report = []

  • 신고 횟수에 제한 없음. 서로 다른 유저를 계속해서 신고
  • 한 유저의 동일한 유저에 대한 신고 횟수는 1회로 처리

제한 조건2

k번 이상 신고된 유저는 게시판 이용이 정지,

해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송

 

 

입력값 id_list, report, k  |  결과값 result

id_list report k result
["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0]
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]

 

 


----- 제한 조건 1 -----

d_list로 dictionary {이름: 0} 생성

report (신고한 id)를 먼저 set으로 만들었다가 다시 list화 (중복제거)

 

user_id를 for문으로 반복하면서 report에서 공백 " " 뒤에 있는 이름을 잘라서 

dictionary에 report횟수를 +1

 

이후 report횟수가 k이상인 유저를 확인해 stop list로 append

 

 

----- 제한 조건 2 -----

k번 이상 신고된 유저는 게시판 이용이 정지,

정지된 유저를 신고한 유저에게 결과메일 보내주어야함

split(" ")[0]

 

유저가 어떤 유저를 신고했는지 key : [] 값으로 만들어둘까?

stop이름이 신고값에 들어가있으면

id_list.index를 찾아서  answer에 +1 

 

+ answer에 메일 횟수를 더할 수 있도록 [0] * len(id_list)를 생성

결과 메일을 받을 횟수를 list 담아 return

 

 

 

 

 

문제를 풀며 생겼던 오류

 

answer index에 더하는 형식을 취하려 했지만 오류가 났다

빈 answer list를 주고 + 해주었기 때문.

 

 

따라서 answer를 선언할 때 아래와 같이 수정

 

answer = [0] * len(id_list)

 

 

 

 

리뷰.

 

문제를 풀이하며 새롭게 알게 된 것.

 

1. 신고당한 id를 확인하기 위해 사용한 split(" ")[1]

 

2. spilt(" ")을 다중할당으로 받기

 

3. dictionary : dic[key]에 append()하면 value값에 있는 list에 append할 수 있다!

 

 

 

어렵지만 보람찬 문제 풀이였다:)