본문 바로가기
코딩테스트

[파이썬] 신고 결과 받기 - 2022 KAKAO BLIND [CODING TEST #3]

by ALTERww 2022. 7. 19.
320x100

https://school.programmers.co.kr/learn/courses/30/lessons/92334

 

 

 

조금 헷갈릴 수 있는데, id_list로 사용자들의 이름이 들어오기 때문에 리스트의 인덱스를 쓰기 보다는 딕셔너리를 사용하는 것이 낫다고 생각되었다.

두 가지 딕셔너리가 필요했다.

 

  • reported : user별 신고당한 횟수를 세기 위한 딕셔너리. key - user id, value - reported counts.
  • report_list : user별 신고한 user를 모아 놓은 리스트를 value로 가지는 딕셔너리. key - user id, value - report users.

 

report 내 신고 내역을 돌면서, 신고 횟수를 reported에 추가하고 report_list[신고한 유저]에 신고당한 유저를 추가한다.

그리고 k 이상 신고당한 유저를 따로 ban_list에 추가하고, ban_list 내 b가 report_list[id_list[i]]에 있으면 answer[i]를 증가시킨다.

 

중요한 점은 user1 -> user2에 대한 여러 번의 신고는 하나의 신고로 치기 때문에, set() 함수를 이용하여 중복을 지워 주어야 한다.

 

from collections import defaultdict # 각 index에 값을 미리 할당하지 않아도 된다 !!

def solution(id_list, report, k):
    answer = [0] * len(id_list) # user id수만큼 리스트 생성
    report = set(report) # user1 -> user2에 대한 여러 번의 신고는 하나로 간주. set()를 통해 중복 제거
    reported = defaultdict(int) # key - user id, value - reported counts.
    report_list = defaultdict(list) # key - user id, value - report users.
    ban_list = [] # k회 이상 신고되어 정지된 user list
    
    for r in report: 
        user1, user2 = r.split(' ')
        reported[user2] += 1 # 신고당한 user는 reported 횟수 추가
        report_list[user1].append(user2) # report_list[user1]에 user2를 추가.
        
        if reported[user2] == k: # banned user
            ban_list.append(user2)
    
    for b in ban_list: # ban list check
        for i in range(len(id_list)): # 모든 user를 check
            if b in report_list[id_list[i]]: # ban user가 report_list에 있으면 Mail.
                answer[i] += 1
    return answer

 

1단계 문제라지만 결코 만만치 않았다. 딕셔너리를 많이 다뤄 보지 않아서 2개의 딕셔너리를 생각하기 어려웠고, set() 함수같은 것도 검색해서 처음 사용해 보았기 때문에..  그래도 defaultdict 같은 모듈은 차후 유용하게 써먹을 것 같다. 화이팅!

댓글