DHistory
[Programmers] Level 1 - 신고 결과 받기 본문
문제
풀이 1 (문제 요구사항으로 풀기)
"""
1. 한 번의 한 명의 유저를 신고
- 신고 횟수 제한 없음
- 서로 다른 유저를 계속 신고 가능
2. k번 이상 신고된 유저는 게시판 이용이 정지
해당 유저를 신고한 유저에게 정지 사실을 메일로 발송
== example ==
전체 유자: muzi, frodo, apeach, neo
k(신고 횟수): 2번
유저ID 신고ID
muzi frodo
apeach frodo
frodo neo
muzi nedo
apeach muzi
frodo / neo 2번 신고
## 결과 ##
유저ID / 신고ID / 정지ID
muzi / frodo, nedo / frodo, neo (2)
frodo / neo / neo (1)
apeach / muzi, frodo / frodo (1)
neo / x / x
각 유저별로 처리 결과 메일을 받은 횟수: [2, 1, 1, 0]
"""
def solution(id_list, report, k):
answer = []
# 초기화
reports = {}
reports_history = {}
for id in id_list:
reports.setdefault(id, 0)
reports_history.setdefault(id, [])
# 신고
for data in report:
reporter, reported = data.split()
# 이미 신고를 진행한 경우 다시 신고할 수 없음
if reported in reports_history[reporter]:
continue
reports[reported] += 1
reports_history[reporter].append(reported)
# 정지 대상자
block_list = []
for data in reports.items():
if data[1] >= k:
block_list.append(data[0])
# 신고 대상자 확인
for data in reports_history.values():
result = 0
for reported in data:
if reported in block_list:
result += 1
answer.append(result)
return answer
채점 결과
풀이 2 (리팩토링)
def solution_refactoring(id_list, report, k):
# 이미 신고를 진행한 경우 다시 신고할 수 없음
report = set(report)
# 초기화
reports = {id: 0 for id in id_list}
reports_history = {id: [] for id in id_list}
# 신고
for data in report:
reporter, reported = data.split()
reports[reported] += 1
reports_history[reporter].append(reported)
# 정지 대상자
block_list = [data[0] for data in reports.items() if data[1] >= k]
# 신고 대상자 확인
return [len(set(data) & set(block_list)) for data in reports_history.values()]
채점 결과
테스트 3, 7, 8, 9, 10, 11, 14, 15, 20, 21의 결과를 살펴보면 "풀이1"보다 "풀이2"의 성능이 더 좋은 걸 알 수 있습니다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Programmers] Level 1 - 최소직사각형 (0) | 2023.08.02 |
---|---|
[Programmers] Level 1 - 나머지가 1이 되는 수 찾기 (0) | 2023.08.02 |
[Programmers] Level 1 - 성격 유형 검사하기 (0) | 2023.08.01 |
[Programmers] Level 1 - 숫자 짝꿍 (0) | 2023.08.01 |
[Programmers] Level 1 - 삼총사 (0) | 2023.08.01 |