코테 공부/프로그래머스

[Python] 신고 결과 받기

prefer_all 2022. 6. 21. 12:39

 

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

핵심) 1. 유저가 어떤 사람을 신고했는지 2. 유저가 몇 번 신고를 당했는지

  • Dictionary를 사용. (매칭되는 두 가지 값을 한 번에 저장하고 싶을 때)
  • 첫번째 dictionary는 유저별 신고id를 저장.
  • 두번째 dictionary는 유저별 신고당한 횟수를 저장

아이디어) 중복 신고 제거 -> set 사용

def solution(id_list, report,k):
    answer = []
    report = list(set(report))     # 중복 신고 제거
    user = defaultdict(set)    # user별 신고한 id 저장
    cnt = defaultdict(int)    # user별 신고당한 횟수 저장
	
    for r in report:
        # report의 첫번째 값은 신고자id, 두번째 값은 신고당한 id
        a,b = r.split()
        # 신고자가 신고한 id 추가
        user[a].add(b)
        # 신고당한 id의 신고 횟수 추가
        cnt[b] += 1
    
    for i in id_list:
        result = 0
        # user가 신고한 id가 k번 이상 신고 당했으면, 받을 메일 추가
        for u in user[i]:
            if cnt[u]>=k:
                result +=1
        answer.append(result)
    return answer

 


from collections import defaultdict
 
def solution(id_list, report, k):
    answer = []
 
    report_to_from = defaultdict(set) # key(id)를 신고한 목록
    report_from_to = defaultdict(set) # key(id)가 신고한 목록
    for r in report:
        report_from, report_to = r.split(' ') # 공백을 기준으로 from/to 구분
        report_to_from[report_to].add(report_from) # report_to를 신고한 목록에 from 추가
        report_from_to[report_from].add(report_to) # report_from이 신고한 목록에 to 추가
 
    for _id in id_list:
        cnt = 0
        for r_to in report_from_to[_id]: # _id가 신고한 목록에서 아이디를 가져옴(r_to)
            if len(report_to_from[r_to]) >= k:  # r_to 신고한 목록의 개수가 k 이상인 경우 cnt++
               cnt += 1
        answer.append(cnt)
    return answer

'코테 공부 > 프로그래머스' 카테고리의 다른 글

[Python/완전탐색] 카펫  (0) 2022.08.02
[Python] 행렬의 덧셈  (0) 2022.08.02
[Python] 가장 큰 수(어려웠음)  (0) 2021.08.09
[Python] 정렬/k번째 수  (0) 2021.08.06
[Python/해시] 완주하지 못한 선수  (0) 2021.08.05