본문 바로가기
Engineering WIKI/Programmers

[프로그래머스] 신고 결과 받기

by wonos 2022. 4. 1.
 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

 좋은 코드지만 시간 초과 남

def solution(id_list, reports, k):
    stop = []
    answer = [0] * len(id_list)
		reports = set(reports)
		# {wono : [] }
    dicReports = {id: [] for id in id_list} # 딕셔너리에 value는 리스트 구조
    for i in reports:
        report = i.split(' ')
        stop.append(report[1])
        dicReports[report[0]].append(report[1])
        
    stop = set([i for i in stop if stop.count(i) >= k])

    for key, value in dicReports.items():
        for s in stop:
            if s in value:
                answer[id_list.index(key)] += 1
    return answer

 

두번째 방법

from collections import defaultdict

def solution(id_list, report, k):
	answer = [0] * len(id_list)

	report = set(report)

	call_user_list = defaultdict(set) # 유저 A가 신고한 유저 목록(set)
	ben_user_list = defaultdict(int) # 유저 A가 신고당한 횟수(int)
	stop = []
	
	for i in report:
		call_user, ben_user = i.rsplit() 
		ben_user_list[ben_user] += 1
		call_user_list[call_user].add(ben_user)
		
		if ben_user_list[ben_user] == k:
			stop.append(ben_user)
		
	for s in stop:
		for i in range(len(id_list)):
			if s in call_user_list[id_list[i]]:
				answer[i] += 1
			
	return answer

 

다른 풀이

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