2024년 4월 21일 일요일

2022 KAKAO BLIND RECRUITMENT 신고 결과 받기 Lv. 1

문제 링크: 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)

for report in reports:
    reporter, reported = report.split(
' ')
    dict[reported].add(reporter)

신고한 유저와, 신고된 유저를 reporter, reported변수로 각각 나눕니다.

딕셔너리는 reported를 키로 set()을 하나씩 가지고 있기 때문에, reported를 신고한 유저를 add()메서드로 추가해 줍니다.

 

신고한 유저의 숫자가 k 횟수 미만이면 정지 대상이 아니기 때문에 삭제해 줍니다. 이 코드는 꼭 필요하지는 안습니다, 이후에 id_list에 있는 각 user별로 정지 이메일을 몇통 받을 지 계산할 때, 딕셔너리의 모든 키를 방문해야 하게 됩니다. 이 때, 딕셔너리의 키의 개수가 작으면 문제를 좀 더 빠른 속도로 풀 수 있어서, k 횟수 미만 신고된 유저는 딕셔너리에서 삭제합니다.

for key in list(dict.keys()):
   
if len(dict[key]) < k:
       
del dict[key]

 

이제 id_list에 있는 각 유저가 정지되었다는 이메일을 몇통 받을지 알아보는 코드입니다.

answer = [0 for _ in range(len(id_list))]
for idx in range(len(id_list)):
    id = id_list[idx]

   
for key in dict.keys():
       
if id in dict[key]:
            answer[idx] +=
1

우선 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
from collections import defaultdict


def solution(id_list: List[str], reports: List[str], k: int):
    dict = defaultdict(
set)

   
for report in reports:
        reporter, reported = report.split(
' ')
        dict[reported].add(reporter)

   
for key in list(dict.keys()):
       
if len(dict[key]) < k:
           
del dict[key]

    answer = [
0 for _ in range(len(id_list))]
   
for idx in range(len(id_list)):
        id = id_list[idx]

       
for key in dict.keys():
           
if id in dict[key]:
                answer[idx] +=
1

   
return answer

 

댓글 없음:

댓글 쓰기