문제
https://school.programmers.co.kr/learn/courses/30/lessons/92334
사용 언어
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이 여러모로 더 편하지 않나...하는 생각이다.
시간은 크게 차이 나진 않았지만 조금씩 내가 더 빠르다. 내 코드 시간 시간복잡도가 생각보다 더 나쁘지 않았구나??🤔
출처: 프로그래머스
'코딩 테스트 스터디 > 프로그래머스' 카테고리의 다른 글
[level 2] 게임 맵 최단거리 (0) | 2022.07.22 |
---|---|
[level 2] 오픈채팅방 (0) | 2022.07.21 |
[Level 1] 키패드 누르기 (0) | 2022.05.15 |
[Level 2] 정렬. 가장 큰 수 (0) | 2022.03.01 |
[Level 2] 스택/큐. 다리를 지나는 트럭 (0) | 2022.02.25 |