Python/CoTe

[programmers] 신고 결과 받기

joannekim0420 2022. 2. 27. 15:45
728x90

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr

 

 

 

 

첫 번째 코드

from collections import defaultdict

def solution(id_list, report, k):
    dict_report = defaultdict(list)
    count_report = defaultdict(int)
    check = []
    id_dict = {x:0 for x in id_list}
    
    for line in report:
        if line in check:
            continue
        check.append(line)
        user, user_ = line.split(" ")
        count_report[user_] += 1
        dict_report[user].append(user_)

    for user_id , report_num in count_report.items():
        if report_num >= k:
            for key,value in dict_report.items():
                if user_id in value:
                    id_dict[key] += 1
    return list(id_dict.values())

테스트 케이스 성공, 제출 시 케이스 6개에 대해서 시간초과 있음

-중복을 없애기 위해 check 하는 리스트 생성

 

해결 방법

-처음에는 이중 for문이 문제라고 생각했지만 이중 for문이 아니면 도저히 답 도출이 안 됨.

-생각해보니 모든걸 dictionary로 처리하고 나중에 리스트로 cast해서 return만 해주는 것이라면 check가 리스트일 필요 없고 set 함수로 확인하는 line의 순서가 바뀌어도 된다고 생각

 

 

정답 코드

from collections import defaultdict

def solution(id_list, report, k):
    dict_report = defaultdict(list)
    count_report = defaultdict(int)
    id_dict = {x:0 for x in id_list}
    
    for line in set(report):
        user, user_ = line.split(" ")
        count_report[user_] += 1
        dict_report[user].append(user_)

    for user_id , report_num in count_report.items():
        if report_num >= k:
            for key,value in dict_report.items():
                if user_id in value:
                    id_dict[key] += 1
    return list(id_dict.values())

!포인트

- key,value 값을 찾고자 할 때는 하나하나 순회하는 리스트보다 바로 key에 대한 value 값을 찾는 dictionary가 훨씬 빠름