https://programmers.co.kr/learn/courses/30/lessons/92334
내 풀이
from collections import defaultdict
def solution(id_list, report, k):
answer = [0] *len(id_list)
report = set(report)
user_list_i_reported = defaultdict(set)
num_of_reported = defaultdict(int)
suspended = []
for r in report:
report,be_reported = r.split()
num_of_reported[be_reported] += 1
user_list_i_reported[report].add(be_reported)
if(num_of_reported[be_reported] == k):
suspended.append(be_reported)
print(suspended)
print(user_list_i_reported)
return answer
idea
- '한 유저를 여러번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리된다' 는 문제의 조건에서 중복을 허용하지 않는 '집합'을 사용해야겠다는 생각을 하였습니다.
- 아래 문제의 표를 보고 딕셔너리를 사용해야겠다는 생각을 하였습니다.
3.defaultdict(set) 를 사용하여 누가 누구를 신고했는지를 정리하고 defaultdict(int)를 사용하여 누가 몇번 신고당했는지의 횟수를 저장하였습니다.
다른 사람 풀이 리뷰
def solution(id_list, report, k):
answer =[0]*len(id_list)
reported_list = defaultdict(int)
##중복제거
report = set(report)
for i in report:
reported_list[i.split()[1]] += 1
print("reported_lst: "+ str(reported_list))
print(reported_list['neo'])
print("report: "+ str(report))
for i in report:
if(reported_list[i.split()[1]] >= k):
answer[id_list.index(i.split()[0])] += 1
return answer
따로 누가 누구를 신고했는지를 저장하지 않고
index를 활용하여 직접 answer에 값을 넣어주었습니다. for 문을 한번 덜 쓸수 있다는 점에서 굉장히 매력적이었으나, 실전에서 바로 떠올리긴 어려웠을듯합니다.
배운점 && 공부방향 설정
Problem1) 문제를 해석하는 데에 시간이 오래걸렸다.
-> 많은 문제를 접하면서 문제가 어떤 것을 요구하는지 빨리 이해하는 연습을 하는 방향으로 공부하자.
Problem2) defaultdict() 등 자료형에 대한 이해가 부족하여 구현하는데 시간이 오래걸렸다.
->자료형 관련 구현에 어려움을 느낄 때마다 그 자료형에 관해 추가적인 공부를 하는 방향으로 나아가자.
Problem3) 중간에 꼬이니까 시간이 많이 소요되었다.
-> 코드의 마지막까지 설계한 후 코딩하는 방향으로 문제를 풀자.
'CS > 알고리즘' 카테고리의 다른 글
백준 2580번 스도쿠 파이썬 풀이 (0) | 2022.03.14 |
---|---|
백준 9663번 N-Queen 파이썬 풀이 (0) | 2022.03.11 |
백트래킹 알고리즘 정리(feat. 백준 15649번 파이썬 풀이) (0) | 2022.03.06 |
백준 11651번 좌표 정렬하기 2 파이썬 풀이 (0) | 2022.03.03 |
백준 2108 통계학 파이썬 풀이 (0) | 2022.03.01 |