2 분 소요

문제 링크

내 풀이

def solution(id_list, report, k):
    report2 = list(set(report))
    singo_count= {}
    singo_dict = {}
    users = []
    k_up = []
    result = []
    for user in id_list:
        singo_count[user] = 0
        singo_dict[user] = []
    for singo in report2:
        user_id, singo_id = singo.split()
        singo_dict[user_id].append(singo_id)
        singo_count[singo_id] += 1
    for user in singo_count:
        if singo_count[user] >= k:
            k_up.append(user)
    # singo_dict의 values와 k_up의 교집합 len 구하기
    for singo in singo_dict:
        result.append(len(set(singo_dict[singo]) & set(k_up)))
        
    return result
    
  • 시작부터 report에 set함수를 적용하여 중복된 신고를 방지

다른 풀이

def solution(id_list, reports, k):
    
    user_list = {id:{"reported_me":set(),"mail":0} for id in id_list}
    #user_list = {
    #    "아이디": {
    #       "나에게 신고한 유저": set(), #중복제거를 위해 set()사용
    #       "신고 성공(mail을 받을 횟수)": 0,
    #    }
    #}
    
    for report in reports:
        report = report.split(" ")
        #report[0] 신고한 유저
        #report[1] 신고당한 유저
        
        user_list[report[1]]["reported_me"].add(report[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
    
    mail_values = [value["mail"] for value in user_list.values()]
    #user_list에서 "mail"값만 추출
    
    return mail_values
출처: https://1ets-just-do-it.tistory.com/9 [파이썬은 신이야🔥🔥🔥:티스토리]

풀이 해석

  • user_list를 자신을 신고한 유저와 신고 성공한 횟수를 저장할 value로 나누어 dict를 만들었다
  • 이때 자신을 신고한 유저가 동일유저일 경우 겹치는 것을 방지하기 위해 set함수를 이용
  • 그 이후 len(set)이 k가 넘을 경우 신고한사람의 mail value가 1씩 증가하게 하여 최종적으로 mail value값만을 추출하여 list를 만들었다

배울 점

  • dict 타입안에 value를 나눈 형태로 만든 사고
  • 신고한 유저와 성공한 횟수를 value로 이용한 사고
  • 안겹치게 하기 위해 set 함수를 이용

또 다른 풀이

def solution(id_list, report, k):
    answer = [0] * len(id_list)
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

풀이 해석

  • set(report)를 통해 중복된 신고 방지
  • id_list.index를 통해 answer의 값을 수정한 후 answer를 리턴하였다

배울 점

  • set 함수를 통한 report의 중복 방지
  • reports = {x:0 for x in id_list}를 통해 빠른 dict 생성
  • [0] * len(id_list)를 통한 공간 활용
  • r.split()[1] 이와같이 함수 호출과 동시에 바로 활용하는 간결함

댓글남기기