관리 메뉴

log.Sehee

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

Algorithm

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

Sehe_e 2023. 8. 25. 20:57

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

 

사용 입출력 예제

id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"]
k = 2

 

1)

정확성테스트 : 시간초과

더보기
테스트 1  통과 (0.02ms, 10.1MB)
테스트 2  통과 (0.06ms, 10.3MB)
테스트 3  실패 (시간 초과)
테스트 4  통과 (0.11ms, 10.2MB)
테스트 5  통과 (0.19ms, 10.2MB)
테스트 6  통과 (16.51ms, 10.5MB)
테스트 7  통과 (33.74ms, 10.8MB)
테스트 8  통과 (37.29ms, 11.2MB)
테스트 9  통과 (9701.77ms, 26.8MB)
테스트 10  실패 (시간 초과)
테스트 11  실패 (시간 초과)
테스트 12  통과 (9.45ms, 10.2MB)
테스트 13  통과 (9.82ms, 10.3MB)
테스트 14  실패 (시간 초과)
테스트 15  실패 (시간 초과)
테스트 16  통과 (1.96ms, 10.4MB)
테스트 17  통과 (9.59ms, 10.1MB)
테스트 18  통과 (18.39ms, 10.2MB)
테스트 19  통과 (36.64ms, 10.5MB)
테스트 20  실패 (시간 초과)
테스트 21  실패 (시간 초과)
테스트 22  통과 (0.01ms, 10.2MB)
테스트 23  통과 (0.01ms, 10MB)
테스트 24  통과 (0.01ms, 10.2MB)
# 1)
def solution(id_list, report, k):
    report = set(report)	# 중복 신고 제거
    answer, record = [], []
    report_count = {}

    for id in id_list:
        report_count[id] = 0	# {'muzi': 0, 'frodo': 0, 'apeach': 0, 'neo': 0}
        answer.append(0)	# [0, 0, 0, 0]

    for id in id_list:
        report_id = []
        for n in report:
            r = n.split()
            if r[0] == id:
                report_id.append(r[1])		# id_list의 인덱스 순서대로 id가 신고한 유저를 리스트에 저장
                report_count[r[1]] += 1		# 신고당한 유저는 카운트 +1
        record.append(report_id)

    # record : [['neo', 'frodo'], ['neo'], ['frodo', 'muzi'], []]
    # report_count : {'muzi': 1, 'frodo': 2, 'apeach': 0, 'neo': 2}

    for i in range(len(id_list)):
        for n in record[i]:		# report_count의 value값이 k보다 크거나 같은지 검사
            if k <= report_count[n]:	# record에 포함되어 있는 위치의 인덱스와 같은 자리의 answer 인덱스에 +1
                answer[i] += 1
	
    return answer	# [2, 1, 1, 0]

 


 

2)

정확성테스트

더보기
테스트 1  통과 (0.01ms, 10.3MB)
테스트 2  통과 (0.04ms, 10MB)
테스트 3  통과 (233.44ms, 46.6MB)
테스트 4  통과 (0.05ms, 10.1MB)
테스트 5  통과 (0.04ms, 10.2MB)
테스트 6  통과 (1.19ms, 10.4MB)
테스트 7  통과 (2.06ms, 10.6MB)
테스트 8  통과 (2.68ms, 11.1MB)
테스트 9  통과 (75.54ms, 26.9MB)
테스트 10  통과 (69.06ms, 26.9MB)
테스트 11  통과 (211.09ms, 46.4MB)
테스트 12  통과 (0.24ms, 10.1MB)
테스트 13  통과 (0.20ms, 10.2MB)
테스트 14  통과 (67.27ms, 24.1MB)
테스트 15  통과 (93.67ms, 36.6MB)
테스트 16  통과 (0.18ms, 10.3MB)
테스트 17  통과 (0.30ms, 10.1MB)
테스트 18  통과 (0.38ms, 10.3MB)
테스트 19  통과 (0.52ms, 10.3MB)
테스트 20  통과 (60.73ms, 24.1MB)
테스트 21  통과 (105.94ms, 36.5MB)
테스트 22  통과 (0.01ms, 9.98MB)
테스트 23  통과 (0.01ms, 10.2MB)
테스트 24  통과 (0.01ms, 10.1MB)
# 2)
def solution(id_list, report, k):
    report = set(report)
    user, d_answer = {}, {}
    answer = []

    for id in id_list:
        user[id] = []
        d_answer[id] = 0

    for i in report:
        name = i.split()
        user[name[1]].append(name[0])	# key: 신고당한 유저 / value: 신고한 유저
       
    # {'muzi': ['apeach'], 'frodo': ['muzi', 'apeach'], 'apeach': [], 'neo': ['frodo', 'muzi']}
        
    for i in id_list:
        if k <= len(user[i]):		# 신고한 유저가 k명 이상인 유저를
            for n in user[i]:
                d_answer[n] += 1	# 신고한 유저 카운트 +1
    
    # {'muzi': 2, 'frodo': 1, 'apeach': 1, 'neo': 0}

    for i in id_list:
        answer.append(d_answer[i])	# id_list의 인덱스 순서대로 answer에 append

    return answer	# [2, 1, 1, 0]

 


 

3)

정확성테스트

더보기
테스트 1  통과 (0.02ms, 10.3MB)
테스트 2  통과 (0.04ms, 10.3MB)
테스트 3  통과 (175.64ms, 46.2MB)
테스트 4  통과 (0.04ms, 10.2MB)
테스트 5  통과 (0.03ms, 10.3MB)
테스트 6  통과 (0.79ms, 10.5MB)
테스트 7  통과 (1.25ms, 10.6MB)
테스트 8  통과 (2.96ms, 11.1MB)
테스트 9  통과 (78.22ms, 27.1MB)
테스트 10  통과 (48.84ms, 27MB)
테스트 11  통과 (151.38ms, 46.1MB)
테스트 12  통과 (0.23ms, 10.3MB)
테스트 13  통과 (0.19ms, 10.4MB)
테스트 14  통과 (42.91ms, 24.2MB)
테스트 15  통과 (92.09ms, 36.7MB)
테스트 16  통과 (0.12ms, 10.2MB)
테스트 17  통과 (0.21ms, 10.3MB)
테스트 18  통과 (0.34ms, 10.3MB)
테스트 19  통과 (0.55ms, 10.4MB)
테스트 20  통과 (41.21ms, 24MB)
테스트 21  통과 (83.32ms, 36.7MB)
테스트 22  통과 (0.01ms, 10.3MB)
테스트 23  통과 (0.01ms, 10.2MB)
테스트 24  통과 (0.01ms, 10.3MB)
def solution(id_list, report, k):
    report = set(report)
    user, d_answer = {}, {}
    answer = []

    for id in id_list:
        user[id] = []
        d_answer[id] = 0

    for i in report:
        name = i.split()
        user[name[1]].append(name[0])

    for i, n in user.items():	# .items 사용, 딕셔너리의 값을 바로 사용하도록 리펙토링
        if k <= len(n):
            for j in n:
                d_answer[j] += 1

    # for i in id_list:
    #     if k <= len(user[i]):
    #         for n in user[i]:
    #             d_answer[n] += 1

    for i in id_list:
        answer.append(d_answer[i])

    return answer

 


보충

 

정확성 테스트 :

이번 문제는 for문 하나 더 돌려서 인덱스 자리에 맞게 append 하는 것보다 .index가 느리다

더보기
테스트 1  통과 (0.02ms, 10.4MB)
테스트 2  통과 (0.03ms, 10.1MB)
테스트 3  통과 (1350.20ms, 46.3MB)
테스트 4  통과 (0.03ms, 10MB)
테스트 5  통과 (0.03ms, 10.3MB)
테스트 6  통과 (0.81ms, 10.6MB)
테스트 7  통과 (2.67ms, 10.6MB)
테스트 8  통과 (3.92ms, 11.1MB)
테스트 9  통과 (383.05ms, 27MB)
테스트 10  통과 (53.61ms, 26.9MB)
테스트 11  통과 (522.13ms, 46.5MB)
테스트 12  통과 (0.53ms, 10.2MB)
테스트 13  통과 (0.19ms, 10.1MB)
테스트 14  통과 (466.63ms, 24.1MB)
테스트 15  통과 (86.99ms, 36.6MB)
테스트 16  통과 (0.16ms, 10.2MB)
테스트 17  통과 (0.36ms, 10.4MB)
테스트 18  통과 (0.89ms, 10.2MB)
테스트 19  통과 (2.17ms, 10.1MB)
테스트 20  통과 (442.28ms, 24.1MB)
테스트 21  통과 (918.16ms, 36.7MB)
테스트 22  통과 (0.01ms, 9.96MB)
테스트 23  통과 (0.01ms, 10.1MB)
테스트 24  통과 (0.01ms, 10.1MB)
def solution(id_list, report, k):
    report = set(report)
    # 딕셔너리도 컴프리헨션이 가능함
    user = {i: [] for i in id_list}
    # for문보다 곱하기가 빠른가?
    answer = [0] * len(id_list)

    for i in report:
        name = i.split()
        user[name[1]].append(name[0])

    # .items() 딕셔너리의 key, value 쌍을 얻을 수 있다
    for i, n in user.items():
        if len(n) >= k:
            for j in n:
                # .index() 배열에서 값의 위치를 찾아준다
                answer[id_list.index(j)] += 1

    return answer

 

 

Comments