<로직 고민/>
- 일단 중복 신고는 1회로 처리해야 하니 report를 set 해줘야겠군
- id_list를 딕셔너리로 만들어서 유저별 신고 당한 횟수를 value 값으로 넣어준다
- id_list를 또다른 딕셔너리로 만들어서 유저별 신고 당한 횟수를 기준으로 유저별 메일 받을 횟수를 value값에 넣어준다
- 2번째 만든 딕셔너리의 values()를 list로 바꿔 반환한다
- 이렇게 했더니 시간은 좀 걸리지만 통과..!
- 근데 중간에 만들어놓고 필요없어서 안 쓴 로직을 지우는 걸 깜빡하고 채점했더니 5점이 나왔다
- 그거 지웠으면 점수 더 받았으려나....??
<완성된 풀이/>
def solution(id_list, report, k):
report = list(set(report)) # 중복 신고 횟수 1회로 처리
id_list_dict = {id: 0 for id in id_list} # 유저별 신고 당한 횟수
for r in report:
id_list_dict[r.split()[1]] += 1
answer_dict = {id: 0 for id in id_list} # 유저별 메일 받을 횟수
for r in report:
if id_list_dict[r.split()[1]] >= k:
answer_dict[r.split()[0]] += 1
answer = list(answer_dict.values())
return answer
<다른 사람 풀이/>
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
- 이 사람은 나처럼 answer 딕셔너리를 안 만들고 풀어서 뭔가 더 잘 푼 풀이인 줄 알았는데 채점해보니 내 풀이보다 실행시간이 더 나오네..!
- 근데 index 메서드 활용할 생각을 못 했어서 이렇게도 할 수 있구나~ 하는 걸 알게 돼서 가져와봤다
- 찾아보니 id_list.index()에서 인덱스를 탐색하는 과정의 시간복잡도가 O(n)이고 나처럼 딕셔너리에서 바로 값을 가져오는 건 O(1)이라고 한다
- 결과적으로 둘 다 report를 순회하기 때문에 O(n)의 시간복잡도를 가지는 코드지만, answer 값을 계산하는 과정때문에 실제 실행시간은 내 코드가 더 빠름!