문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92334
파이썬 소스: https://bit.ly/3UAYKWR
문제를 풀기에 앞서서, solution()함수의 인자를 report에서 reports로 변경했습니다. 특별한 이유는 없고, 리스트변수라서 복수의 s를 붙여 줬습니다.
def solution(id_list: List[str], reports: List[str], k: int): |
문제에서 주의해야 할 부분이 아래 부분입니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. |
이 부분은 set()을 사용하면 쉽게 구현할 수 있습니다.
신고한 유저 reporter와 신고된 유저 reported가 있다고 하면, reported에 대해서 set()을 만들고 아래처럼, reported를 신고한 유저를 set()에 계속 추가할 수 있습니다. set()에는 중복된 것이 들어오면 자동으로 삭제해줍니다.
신고된 유저도 여러 명이 있을 수 있으므로, defaultdict()를 사용해서 아래와 같이 구현할 수 있습니다.
dict = defaultdict(set) |
신고한 유저와, 신고된 유저를 reporter, reported변수로 각각 나눕니다.
딕셔너리는 reported를 키로 set()을 하나씩 가지고 있기 때문에, reported를 신고한 유저를 add()메서드로 추가해 줍니다.
신고한 유저의 숫자가 k 횟수 미만이면 정지 대상이 아니기 때문에 삭제해 줍니다. 이 코드는 꼭 필요하지는 안습니다, 이후에 id_list에 있는 각 user별로 정지 이메일을 몇통 받을 지 계산할 때, 딕셔너리의 모든 키를 방문해야 하게 됩니다. 이 때, 딕셔너리의 키의 개수가 작으면 문제를 좀 더 빠른 속도로 풀 수 있어서, k 횟수 미만 신고된 유저는 딕셔너리에서 삭제합니다.
for key in list(dict.keys()): |
이제 id_list에 있는 각 유저가 정지되었다는 이메일을 몇통 받을지 알아보는 코드입니다.
answer = [0 for _ in range(len(id_list))] |
우선 answer에 id_list길이 만큼 0으로 초기화를 해줍니다.
리스트 id_list만큼 for 루프를 실행하구요, 각 id 마다, 딕셔너리의 모든 키, 즉, 신고된 유저를 모두 방문합니다. 여기서 딕셔너리에 있는 신고된 유저는 모두 정지 이메일 발송 대상입니다.
따라서, 신고한 유저의 id가 딕셔너러리의 키가 가리키는 set 안에 들어 있다면, 정지 이메일이 발송됨으로 answer[idx] += 1을 해줍니다. 두개의 for 루프가 완료되면, 각 유저가 받을 정지 이메일의 개수를 구할 수 있습니다.
궁금한 내용은 댓글, 이메일(coding.data.pul@gmail.com)로 보내주세요.
코데풀 유튜브 구독 부탁드립니다.
https://www.youtube.com/@codapul
전체 코드는 아래에 있습니다.
from typing import List |
댓글 없음:
댓글 쓰기