관리 메뉴

솜씨좋은장씨

[Programmers] 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (Python) 본문

Programming/코딩 1일 1문제

[Programmers] 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 (Python)

솜씨좋은장씨 2022. 1. 18. 23:45
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 2022 KAKAO BLIND RECRUITMENT 문제 중 1개인 신고 결과 받기! 입니다.

풀기는 풀었으나 신고 건수가 많아지면 효율이 떨어지는 코드여서 추후에 수정하고자 합니다.

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

👨🏻‍💻 문제 풀이

k번 이상 신고 받은 불량 이용자는 이용 정지가 되며 이용 정지가 되었을 때는

해당 불량 이용자를 신고한 모든 유저에게 불량 이용자 처리결과에 대한

이메일이 전송된다고 할 때 각 유저가 받은 이메일의 개수를 구하는 문제입니다.

단! 한 유저가 같은 사람을 여러번 신고하였을 때에는 여러번의 신고건에 대해서는 1건으로 처리된다고 합니다.

id_list : 유저 ID 리스트
report : 불량 이용자 신고 목록 - "유저ID 불량 이용자ID" 형태
k : 불량 이용자 정지 기준 ( k 회 이상 신고 누적 시 )

입력 받는 값은 위와 같습니다.

answer, check_list = [], []
report_dict = {}
answer = [] : 정답에 사용할 리스트 ( 각 유저가 이메일을 받은 수 ) 
check_list = [] : 한 유저가 중복으로 한 신고를 제외한 모든 신고 내역
report_dict = {} : 각 유저가 신고한 불량 이용자 내역 ( 중복 제외 )

먼저 사용할 값들을 선언합니다.

for report_id in id_list:
    report_dict[report_id] = []

그 다음 report_dict에 각 유저 별로 신고 내역을 담을 list를 생성해주고

for case in report:
    report_id, report_name = case.split()

    if report_name not in report_dict[report_id]:
        report_dict[report_id].append(report_name)

        check_list.append(report_name)

 

불량 이용자 신고내역에서 하나씩 값을 꺼내와서 

전체 신고내역과 각 유저별 신고 내역을 채워줍니다.

이때 신고내역의 값은 신고를 한 유저의 ID와 불량 이용자의 ID가 공백을 기준으로 이어져 있으므로

report_id, report_name = case.split()

split 하여 활용하였습니다.

그리고 중복 신고는 제외하기 위해서 이미 각 유저의 신고목록에 추가된 불량이용자 ID는 더이상 추가하지 않도록 했습니다.

cnt_dict = Counter(check_list)

for report_id in id_list:
    answer.append(len([check for check in report_dict[report_id] if cnt_dict[check] >= k]))

마지막으로 전체 신고 목록에서 각 불량 이용자가 몇 번 씩 신고를 당했는지 확인한 뒤

각 유저의 신고목록에서 k 번 이상 신고를 받은 불량 이용자 ID가 존재할 경우만 남긴 뒤 개수를 세어 정답을 만듭니다.

 

전체 코드는 아래를 참고해주세요.

👨🏻‍💻 코드 ( Solution )

from collections import Counter

def solution(id_list, report, k):
    answer, check_list = [], []
    
    report_dict = {}
    
    for report_id in id_list:
        report_dict[report_id] = []
    
    for case in report:
        report_id, report_name = case.split()
        
        if report_name not in report_dict[report_id]:
            report_dict[report_id].append(report_name)

            check_list.append(report_name)
        
    cnt_dict = Counter(check_list)

    for report_id in id_list:
        answer.append(len([check for check in report_dict[report_id] if cnt_dict[check] >= k]))
        
    return answer

 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments