from collections import defaultdict
def solution(id_list, report, k):
answer = [0]*len(id_list)
reportDict = defaultdict(lambda: 0)
# 신고 사실 취합
for item in set(report):
reportDict[item.split(" ")[1]] += 1
# 알림 내역 발송
# 정지 유저 판별
for item in set(report):
if reportDict[item.split(" ")[1]] >= k:
answer[id_list.index(item.split(" ")[0])] += 1
return answer
아주 간단한 구현 문제지만, 코드를 간결하고 최적화 하기 위해서는 노력이 필요하다.
예를 들면, 나는 처음 코드를 짤 때
신고자가 몇 번 신고 당했는지의 defaultdict, 그리고 누가 누구를 신고했는지의 또 하나의 defaultdict 를 선언해서 풀었다.
하지만, 그렇게 할 필요없이 문제에서 제공한 report 배열을 set으로 바꿔 iteration
하면, 따로 신고자에 대해서 누가 신고했는지 확인할 것 없이 split 0번째, 1번째를 그대로 사용하면 해결된다.
위의 코드가 개선한 풀이
고, 아래 코드가 나의 원래 풀이
였다.
한 눈에 봐도 위의 코드가 더 나은 코드다
라는 생각이 든다.
문제가 조금만 더 복잡했다면 내 코드는 시간 효율성을 통과 못할 정도는 아니겠지만, 더 느릴 것임은 분명하다.
from collections import defaultdict
def solution(id_list, report, k):
answer = []
banned = []
reportDict = defaultdict(lambda: 0)
reporters = defaultdict(set)
# 신고 사실 취합
for item in report:
reporter, reportee = item.split(" ")
if reportee not in reporters[reporter]:
reportDict[reportee] += 1
reporters[reporter].add(reportee)
# 정지 유저 판별
for item, value in reportDict.items():
if value >= k:
banned.append(item)
# 알림 내역 발송
for ids in id_list:
result = 0
for it in reporters[ids]:
if it in banned:
result += 1
answer.append(result)
return answer
프로그래머스 연습문제, https://school.programmers.co.kr/learn/challenges