코딩테스트 풀이

SUSU·2023년 11월 11일
0

신고 결과 받기(https://school.programmers.co.kr/learn/courses/30/lessons/92334)

하.. 고통 스럽다ㅠ 삽질 한시간 하고 안되겠어서 해설봄

내가 접근한 방법은
1. id_list 기준으로 신고횟수 카운트 할 맵 생성하기
2. report의 "신고자 피신고자" 형태를 맵으로 변경 후
3. 맵으로 바뀐 report에서 신고자별로 피신고자 누구인지 카운트..

하려고 했는데 이번문제에서 맵을 사용하는건 맞는데 내가 생각한 방법으로 변경하는건 NG다.
왜냐면 맵에서 같은 key 값이 있으면 value 는 가장 최근에 넣어진 value 값만 보관하기에, 한 유저가 여러번 신고한 경우 가장 나중에 신고당한 값만 남게되니까
신고한 사람은 중복을 허용하지 않는 set 형식으로 받아봐야 함

암튼 답은 이거다... 너무 어렵다 ㅠㅠ

def solution(id_list, report, k):
    
    # id_list를 기준으로 신고자 카운트 맵으로 바꿈 
    user_list = {}
    for user_id in id_list:  #유저 기준으로 날 신고한 사람 리스트랑, 메일 발송 횟수를 받아봄
        user_list[user_id] = {"reported_me": set(), "mail": 0}
    # user_list = {id:{"reported_me":set(),"mail":0} for id in id_list} 컴프리헨션으로 쓰면 일케
        
    for rep in report:
        rep = rep.split(" ") #rep[0] 신고한 유저, #rep[1] 신고당한 유저
        user_list[rep[1]]["reported_me"].add(rep[0])
        # 'muzi': {'reported_me': {'apeach'}, 'mail': 0} 이런식의 맵을 항목으로 가지는 리스트가 생김
        
    for key in user_list:
        #날 신고한 유저의 수가 K값 이상이면 날 신고한 유저들의 mail값 1씩 추가하기
        if (len(user_list[key]["reported_me"]) >= k):
            for user in user_list[key]["reported_me"]:
                user_list[user]["mail"] += 1
    
    #처리 결과 메일을 받은 횟수
    answer = []
    for value in user_list.values():
        answer.append(value["mail"])
        # mail_values = [value["mail"] for value in user_list.values()]
        # 이렇게 컴프리헨션 방식으로 도 쓸수 있음



    return answer
profile
기록용

0개의 댓글