티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/92334
1. 접근 방식
- 누가 누구를 신고했고, 누가 얼만큼 신고당했는지를 딕셔너리로 확인하자.
누가 누구를 신고했는지 나타내는 딕셔너리 reports는 key가 신고한 유저의 이름이고, value는 key한테 신고 당한 유저들의 집합이다. 누가 얼만큼 신고당했는지 나타내는 딕셔너리 warnings는 key는 유저 이름, value는 누적 신고 수이다.
report의 각 원소에서 왼쪽에는 신고한 사람(key), 오른쪽은 신고 당한 사람(value)의 이름이 나온다. 따라서 report를 순회하면서 reports[key]의 집합에 value를 add한다.
이때 key라는 유저가 value 유저를 여러 번 신고하더라도, 1회 신고한 것으로 처리된다. 따라서 value라는 유저가 key가 신고한 유저 집합에 존재하지 않을 때만 warnings[value]의 누적 신고 수를 +1 해야 한다.
즉, 위와 같은 테스트 값이 있을 때 reports와 warnings 딕셔너리 내부 값이 이렇게 변화한다.
2. 정답 코드
- OrderedDict: 순서를 기억하는 딕셔너리
- id_list에 입력된 유저 순서대로 몇 개의 메일을 보내야 하는지 results 리스트에 담아야 하기 때문에 OrderedDict을 사용한다.
from collections import OrderedDict
def find_blcoked(data, k):
return [name for name, value in data.items() if value >= k]
def count_mails(data, blocked):
results = [0] * len(data)
if not blocked:
return results
for index, users in enumerate(data.values()):
cnt = 0
for user in users:
if user in blocked:
cnt += 1
results[index] = cnt
return results
def solution(id_list, report, k):
warnings = {key: 0 for key in id_list}
reports = OrderedDict({key: set() for key in id_list})
for info in report:
key, value = info.split()
if value not in reports[key]:
reports[key].add(value)
warnings[value] += 1
blocked = find_blcoked(warnings, k)
ans = count_mails(reports, blocked)
return ans
728x90
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [1차] 캐시 파이썬 정답 코드 (0) | 2023.06.15 |
---|---|
[프로그래머스] 튜플 파이썬 정답 코드 (0) | 2023.06.15 |
[프로그래머스] 성격 유형 검사하기 파이썬 정답 코드 (0) | 2023.06.13 |
[프로그래머스] 신규 아이디 추천 파이썬 정답 코드 (0) | 2023.06.13 |
[프로그래머스] 크레인 인형뽑기 게임 파이썬 정답 코드 (0) | 2023.06.13 |