728x90
신고 결과 받기 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명
신고 결과 받기에는 다음의 조건들이 존재합니다.
- 1명의 사용자는 같은 사용자를 2번 이상 신고할 수 없다.
- 신고 횟수가 입력 받은 K 값보다 크다면 해당 사용자는 게시판 이용이 정지된다.
- 정지당한 사용자를 신고한 모든 사용자에게 처리 결과 메일이 보낸다.
위의 조건들을 만족하며 각 사용자가 받은 처리 결과 메일의 횟수를 return 하는 것으로 문제를 해결할 수 있습니다.
다음은 조건들을 만족하며 문제를 해결하는 순서입니다.
- report의 중복을 제거하고, 신고자와 신고 당한 사용자로 나눈다.
- report를 순환하며 나를 신고한 이용자의 id를 report_dict에 저장한다.
- report_dict의 key 값을 순환하며 report_dict[key]의 길이가 k가 이상인지 확인한다.
- 3의 조건이 참이라면 report_dict[key](나를 신고한 이용자) 값을 순환하며 answer_dict(내가 받아야 할 메일 개수)를 1씩 증가시킨다.
- 3의 조건이 거짓이라면 3을 반복한다.
해결 순서를 코드로 작성하면 다음과 같습니다.
def solution(id_list, report, k):
report = [item.split() for item in list(set(report))]
answer_dict = {id:0 for id in id_list}
report_dict = {id:[] for id in id_list}
for reporter, target in report:
report_dict[target].append(reporter)
for key in report_dict.keys():
if len(report_dict[key]) >= k:
for value in report_dict[key]:
answer_dict[value] += 1
return list(answer_dict.values())
report에 set을 사용한 이유는 1명의 사용자는 같은 사용자를 2번 이상 신고할 수 없다는 조건을 만족하기 위해서 입니다. 입출력 예시에서도 ["ryan con", "ryan con", "ryan con", "ryan con"] 과 같이 ryan이라는 사용자가 con을 4번 신고한 예시가 존재합니다. 이 신고들은 첫 번째 "ryan con"을 제외하고는 전부 유효하지 않은 신고입니다. 해당 값들을 처리해주지 않는다면 report_dict에 정확한 신고자들의 id가 들어갔다고 보장할 수 없습니다.
유효하지 않은 값을 처리하기 위해서는 중복 제거를 해주면 됩니다. 이때 사용할 수 있는 개념이 바로 set입니다. set을 사용하면 원소의 중복을 허용하지 않는 set의 특성 때문에 위의 4개의 신고가 다음과 같이 1개의 신고로 바뀌게 됩니다. ["ryan con"]
결과적으로 report에는 전부 유효한 신고가 저장됩니다.
728x90
'취업을 준비하며 정리하는 컴퓨터 지식 > Problem Solving' 카테고리의 다른 글
[Problem Solving] 프로그래머스 92335 k 진수에서 소수 개수 구하기 (2) | 2022.01.19 |
---|---|
[Problem Solving] 프로그래머스 92341 주차 요금 계산 (0) | 2022.01.17 |
[Problem Solving] 프로그래머스 42576 완주하지 못한 선수 (0) | 2022.01.13 |
[Problem Solving] 프로그래머스 67257 수식 최대화 (0) | 2022.01.12 |
[Problem Solving] 프로그래머스 42626 더 맵게 (0) | 2022.01.11 |