코딩 테스트 스터디/프로그래머스

[level 1] 신고 결과 받기

남쪽마을밤송이 2022. 7. 20. 16:37

 문제 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 사용 언어 

Python3

 풀이 과정 

좋은 풀이 방법이 생각나지 않아 defaultdict로 풀었는데 한 번에 맞긴 했다..!

일단 내 풀이에서는 개선할 부분이 보이지 않아 풀이를 그대로 올리는데 다른 사람 풀이를 보며 공부했다.

간단한 문제라서 그런지 시간도 뭐 눈에 띄게 느린 정돈 아닌 것 같다.

 제출 답안 

from collections import defaultdict

def solution(id_list, report, k):
    match_dict = defaultdict(set)
    report_dict = defaultdict(int)
    for rep in report:
        user_id, bad_id = rep.split()
        if bad_id not in match_dict[user_id]:
            match_dict[user_id].add(bad_id)
            report_dict[bad_id] += 1
        
    banned_id = set(id for id in id_list if report_dict[id] >= k)

    answer = []
    for id in id_list:
        email_count = len(banned_id & match_dict[id])
        answer.append(email_count)
    
    return answer

 다른 사람 답안 

1.

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

    for r in set(report):
        reports[r.split()[1]] += 1

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

    return answer

내 풀이랑 로직은 비슷한데 defaultdict 대신에 직접 list와 dictionary를 선언했다.

다만 한 사람이 다른 사람을 여러 번 신고한 건 1번으로 간주되기에 report 자체를 set으로 바꿔 for문을 돌린 점이 편해보였다.

그리고 answer에 값을 넣은 방식이 특이했는데 report안의 신고자에 대해 바로 id_list에서 index를 찾아 1을 더해주는 방식... 좋아보이지만 시간이 조금 더 걸릴 것 같아서 직접 돌려봤다.

테스트 3번 케이스를 보면 내 코드로는 142ms가 나왔는데 이 코드로는 1242초나 걸린다. 생각보다 차이가 더 나는..!

 

2.

def solution(id_list, report, k):
    answer = []
    a = list(set(report))
    dictionary2 = {name : 0 for name in id_list}
    dictionary = {name : [] for name in id_list}
    for i in a:
        dictionary[i.split()[1]].append(i.split()[0])

    for i in dictionary:
        if len(dictionary[i]) >= k:
            for j in dictionary[i]:
                dictionary2[j] += 1

    for i in dictionary2:
        answer.append(dictionary2[i])

    return answer

이 코드는 set 대신에 list를 사용한 점이 나랑 다른 것 같다. 근데 그래서 겹치는 요소를 찾기 위해 이중 for문을 돌려야 한다. 순서는 필요없고 교집합의 개수만 알면 되기 때문에 set이 여러모로 더 편하지 않나...하는 생각이다.

시간은 크게 차이 나진 않았지만 조금씩 내가 더 빠르다. 내 코드 시간 시간복잡도가 생각보다 더 나쁘지 않았구나??🤔

 

출처: 프로그래머스