알고리즘&자료구조/코딩테스트 연습

[프로그래머스] 신고결과 받기 python3

계토 2022. 6. 11. 15:57

프로그래머스 신고결과 받기 python3 문제 바로가기

 

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

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

programmers.co.kr

처음에 작성했던 코드는 다음과 같다. 그냥 되는대로 복잡하게 생각한 것.

def solution(id_list, report, k):
    # k 정지 기준이 되는 신고 횟수
    # count 신고횟수 {신고된 사람: 신고된 횟수}
    # l 신고 리스트 {신고한 사람:[신고된 사람]}
    count = dict()
    l = dict()
    answer = []
    who_stopped = [] # 정지된 사람 리스트 # 정지 메일
    
	# initialization
    for i in range(len(id_list)):
        count[id_list[i]] = 0     # 각 사람마다 신고된 횟수를 count하기 위함
        l[id_list[i]] = []        # 신고한 사람에 신고된 사람 리스트를 만들어주기 위함 
        answer.append(0)     	  # 실제 mail count 
        
    # report에서 신고리스트, 횟수 불러오기   
    for r in report:
        do, done = r.split()
        if done not in l[do]:  # 두번 신고한 경우 제외
            count[done] +=1
            l[do].append(done)
    
    # 정지된 사람 목록만들기
    for i in range(len(id_list)):
        if count[id_list[i]] >= k:
            who_stopped.append(id_list[i])
            
    # 메일 보내기 (횟수 count)
    for i in range(len(id_list)): 
        for stopped in l[id_list[i]]: # 신고한 사람: [신고된 사람]
            if stopped in who_stopped:
                answer[i] += 1
                
    return answer

이해할 수 있는 것 위주로 다른 사람들의 코드를 참고하여 좀 더 간단하게 만들어 본 것.

 

def solution(id_list, report, k):
    # k 정지 기준이 되는 신고 횟수
    # l 신고 리스트 {신고된 사람:[신고한 사람]} 원래는 {신고한 사람:[신고된 사람]}
    
    # initialization
    # For loop 돌리는 것은 똑같지만, 코드가 그래도 좀 더 간단해짐
    l = {x:[] for x in id_list}
    mail = {x:0 for x in id_list}
    answer = [0] * len(id_list)

    for r in set(report): # set으로 바꿔주면 중복된 신고를 바로 제거할 수 있음
        do, done = r.split()
        l[done].append(do)
        
    for id in id_list:
        if len(l[id]) >= k: # count를 별도로 쓰지 않고 바로 len으로 count
            for dos in l[id]:
                mail[dos] += 1 # mail count를 dictionary에 쌓아줌
                
    for i in range(len(id_list)):
        answer[i] = mail[id_list[i]] # 바로 answer에 넣어줌.

    return answer

 

저장되는 정보의 개수가 줄었고, 실제로 실행 속도가 1/10 까지 줄어든 test case가 있었다!