본문 바로가기

CodingTest/Programmers

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

 

 

/  제출 1  /

def solution(id_list, report, k):
    answer = []
    result = {i:0 for i in id_list}
    reported = {}
    for i in range(len(report)):
        a, b = report[i].split()
        if b in reported and a not in reported[b]:
            reported[b].append(a)
        else:
            reported[b] = [a]
            
    for reported_user in reported:
        if len(reported[reported_user]) >= k:
            for i in range(len(reported[reported_user])):
                user = reported[reported_user][i]
                result[user] += 1
    for user in result:
        answer.append(result[user])
    return answer
채점 결과
정확성: 20.8
합계: 20.8 / 100.0
5 / 24 solved.

아휴.. 한 번에 안 되냐 ....

 

 
제한시간이 10초가 정확성테스트에 포함되어 있어서 시간에서 걸린기도 했다고 생각합니다.
 
테스트 1 〉 통과 (0.01ms, 10.1MB)
테스트 2 〉 실패 (0.02ms, 10.3MB)
테스트 3 〉 실패 (173.10ms, 27.5MB)
테스트 4 〉 실패 (0.03ms, 10.2MB)
테스트 5 〉 실패 (0.04ms, 10.4MB)
테스트 6 〉 실패 (1.00ms, 10.3MB)
테스트 7 〉 실패 (2.27ms, 10.6MB)
테스트 8 〉 실패 (4.34ms, 10.8MB)
테스트 9 〉 실패 (65.92ms, 18.4MB)
테스트 10 〉 실패 (72.93ms, 18.5MB)
테스트 11 〉 실패 (165.25ms, 27.4MB)
테스트 12 〉 실패 (0.24ms, 10.3MB)
테스트 13 〉 통과 (0.24ms, 10.2MB)
테스트 14 〉 실패 (63.66ms, 18.6MB)
테스트 15 〉 실패 (117.01ms, 27.4MB)
테스트 16 〉 실패 (0.14ms, 10.2MB)
테스트 17 〉 실패 (0.16ms, 10.2MB)
테스트 18 〉 실패 (0.35ms, 10.3MB)
테스트 19 〉 실패 (0.79ms, 10.3MB)
테스트 20 〉 실패 (53.54ms, 18.7MB)
테스트 21 〉 실패 (112.10ms, 27.2MB)
테스트 22 〉 통과 (0.01ms, 10.1MB)
테스트 23 〉 통과 (0.01ms, 10.2MB
테스트 24 〉 통과 (0.01ms, 10.1MB)

 

다시 따져보면 불필요한 과정이 꽤 많이 섞여있습니다. 

효율적으로 다시 구성할 체력이 안 나서 같은 로직으로 다른 분의 푼 걸 참고해 다시 풀이를 했습니다.


 

def solution(id_list, report, k):
    answer = [0] * len(id_list)
    reported = {i: 0 for i in id_list}
    for r in set(report):
        reported[r.split()[1]] += 1
    for r in set(report):
        if reported[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1
    return answer
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
 
불필요하게 배열을 많이 선언하지도 않아서 일단 딱 직관적으로 코드를 파악하기 좋습니다. 

 

answer 부분에 값을 더해줄 때, id_list의 인덱스를 가져와서 값을 더하는 식으로 깔끔하게 구현한 것이 제가 못 해낸 포인트입니다. 해당 부분을 재반복하며 확실히 익혀야겠습니다.
 
set()함수도 다시 리마인드합시다. 자료형을 적절하게 사용하여 줍시다.
 

 

/   22.08.10 1차 복습  /

 

def solution(id_list, reports, k):
    # initialize
    users = {}
    reportedUsers = {}
    for user in id_list:
        users[user] = []
        reportedUsers[user] = []
        
    # 신고 목록 만들기
    for report in reports:
        user, reported = report.split(" ")
        if user not in reportedUsers[reported]:
            reportedUsers[reported].append(user)
        if reported not in users[user]:
            users[user].append(reported)
            
    # 정지 목록 만들기      
    suspended = []       
    for reportedUser in reportedUsers:
        if len(reportedUsers[reportedUser]) >= k:
            suspended.append(reportedUser)
            
    # 처리 결과 리스트 만들기        
    result = []
    for user in users:
        cnt = 0
        for susUser in suspended:
            if susUser in users[user]:
                cnt += 1
        result.append(cnt)
    return result
 

: 확실히 리스트나 딕셔너리 다루는데 익숙해져서 구현력이 많이 는 것 같다. 한 번에 패스가 나온다.

두 달만의 성취.. 눈물 나 진짜.. 지난 시간들 생각하면 더 눈물 나..자기연민 집어치우고 더 달려라 달려