Computer Science/Algorithm
[Programmers] Level 1 - 신고 결과 받기
ddu0422
2023. 8. 2. 14:39
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 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"의 성능이 더 좋은 걸 알 수 있습니다.