내 풀이
def solution(id_list, report, k):
a = {} # {멤버id : 신고당한 횟수}
b = {} # {멤버id : 나를 신고한 아이디 list}
c = {} # {멤버id : 정답}
for i in id_list:
a[i] = 0
b[i] = []
c[i] = 0
for i in report:
if b[list(i.split())[1]].count(list(i.split())[0]) == 0:
a[list(i.split())[1]] += 1
b[list(i.split())[1]].append(list(i.split())[0])
for i in a:
if a[i] >= k:
for j in b[i]:
c[j] += 1
return list(c.values())
1. 멤버id 별로 "몇 번 신고받았는지(a)", "누가 나를 신고했는지(b)"를 각각 저장하는 딕셔너리 2개를 만들었다.
2. 첫 번째 for문은 생성한 딕셔너리들(a, b, c)을 초기화하는 과정이다.
3. 두 번째 for문은 매개변수로 입력된 report에 담긴 정보를 기반으로 하여, 딕셔너리 a, b에 차곡 차곡 데이터를 쌓는다.
1) list(i.split())[0]은 신고한 사람 id이다.
2) list(i.split())[1]은 신고당한 사람 id이다.
3) if문의 의미는 "이번에 신고당한 사람"이 "이번에 신고한 사람"으로 최초로 신고당한 것인지를 판단한다.
4) if문에서 최초로 신고당한 것이 맞다면 타당한 신고이므로, if문의 내용을 실행한다.
4. 세 번째 for문은 딕셔너리 a, b에 담긴 값들을 통해, k번 이상 신고당한 사람을 신고한 사람 id(최종 답)을 딕셔너리 c에 담는다.
다른 사람 풀이
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
1. 리스트 answer에 id 개수만큼 0을 담는다.
2. 각 id별로 신고당한 횟수를 기입할 딕셔너리 reports를 만든다. (처음에는 모든 id가 신고를 0회 받았다.)
3. 첫 번째 for문
1) report를 집합 자료형으로 바꾸었으므로, 중복되는 신고는 자동으로 걸러진다.
2) r.split()[1]은 신고당한 사람이다.
3) for문을 돌린 결과, reports에는 각 id별로 신고당한 횟수가 저장되었다.
4. 두 번째 for문
1) 신고당한 횟수가 k번을 초과한 사람을 if문으로 찾아낸다.
2) r.split()[0]은 신고한 사람이다.
3) 신고한 사람의 id를 id_list.index() 함수에 넣어서, id_list에서 몇 번째 인덱스에 있는지 알아낸다.
4) 찾아낸 인덱스를 기반으로 answer를 완성시켜 나간다.