코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
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
'Engineering WIKI > Programmers' 카테고리의 다른 글
[프로그래머스] 소수 만들기 (0) | 2022.04.01 |
---|---|
[프로그래머스] 내적 (0) | 2022.04.01 |
[프로그래머스] 음양 더하기 (0) | 2022.04.01 |
[프로그래머스] 없는 숫자 더하기 (0) | 2022.04.01 |
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2022.04.01 |
[프로그래머스] 키패드 누르기 (0) | 2022.04.01 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.04.01 |
[프로그래머스] 로또의 최고순위와 최저순위 (0) | 2022.04.01 |