2022.06.22.

프로그래머스 '신고 결과 받기' 문제 피드백

 

 

 

 

 

1번째 시도: 시간 초과

 

def solution(id_list, report, k):

    id_report = []
    for i in id_list:
        reported = []
        
        for j in report:
            j = j.split()
            
            if i == j[0]:

                if j[1] not in reported:
                    reported.append(j[1])
        id_report.append(reported)
    

    
    report_result = []
    for i in id_list:
        report_num = 0
        
        for j in id_report:
            for l in j:
                if i == l:
                    report_num = report_num + 1
                    
        report_result.append(report_num)

        
        
    order = 0
    report_result_id = []
    for i in report_result:
        if i >= k:
            report_result_id.append(id_list[order])
            
        order = order + 1
            

                
    answer = []
    for i in id_report:
        reported_num = 0
        for j in i:
            for l in report_result_id:
                if j == l:
                    reported_num = reported_num + 1

        answer.append(reported_num)
    

    
    return answer

 

처음 풀어보는 프로그래머스의 코딩 문제였다.

감이 없어 일단 문제의 순서에 따라 코드를 작성하니

정답은 맞았지만 시간 초과로 틀리게 되었다.

 

 

 

 

 

 

2번째 시도: 시간 초과

 

def solution(id_list, report, k):

    id_report = []
    reported_list = []
    for i in id_list:
        reported = []
        
        for j in report:
            j = j.split()
            
            if i == j[0]:

                if j[1] not in reported:
                    reported.append(j[1])
                    reported_list.append(j[1])
        id_report.append(reported)
    
    

    report_result = []    
    for i in id_list:
        if reported_list.count(i) >= k:
            report_result.append(i)        


                
    answer = []
    for i in id_report:
        report_mail_num = 0
        for j in i:
            for l in report_result:
                if j == l:
                    report_mail_num = report_mail_num + 1

        answer.append(report_mail_num)
    

    
    return answer

 

좀 더 간단하게 작성한 두 번째 코드..

그렇지만 역시나 시간초과

 

 

 

 

 

 

3번째 시도: 시간 초과

 

def solution(id_list, report, k):

    id_report = []
    reported_list = []
    for i in id_list:
        reported = []
        
        for j in report:
            j = j.split()
            
            if i == j[0]:

                if j[1] not in reported:
                    reported.append(j[1])
                    reported_list.append(j[1])
        id_report.append(reported)
    
    

    answer = [0] * len(id_list)
    
    for i in id_list:
        report_mail_num = 0
        
        if reported_list.count(i) >= k:
            
            order = 0
            for j in id_report:
                for l in j:
                    if l == i:
                        answer[order] = answer[order] + 1
                order = order + 1

                
                            
    return answer

 

좀 더 간단하게 작성한 세 번째 코드조차 시간초과..

공부할 시간이 많지 않기에

그냥 다른 사람의 코드를 보기로 결정하였다

 

 

 

 

 

 


 

 

 

 

 

모범 답안

 

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reported = {x : 0 for x in id_list}

    for i in set(report):
        reported[i.split()[1]] += 1

    for i in set(report):
        if reported[i.split()[1]] >= k:
            answer[id_list.index(i.split()[0])] += 1

    return answer

 

진짜 깔끔한 코드.. 보자마자 놀랐다

 

  • [ 0 ] * len( id_list ) : 0으로 채워진 list 만들기

 

  • { x : 0 for x in id_list } : 신고 받은 횟수를 기록하기 위해 dictionary 생성

 

  • set( report ) : 중복되는 신고횟수를 제거하기 위한 set( ) 함수

 

  • reports[ r.split( )[1] ] += 1 : 신고 횟수 기록하기

 

  • answer[ id_list.index( r.split( )[0] ) ] += 1 : 메일 받은 횟수 기록하기

 

복사했습니다!