티스토리 뷰
반응형
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을 숫자를 넣을 수 있는 id 리스트로 만들어준다.
그리고 리포트를 dict 형태로 초기화 시켜주는데, list comprehension을 이용해서 각각 이름을 설정해주면 된다.
reports = {x : 0 for x in id_list}
print(reports)
>{'muzi': 0, 'frodo': 0, 'apeach': 0, 'neo': 0}
for 루프에서 report에 있는 이름을 돌면서, 이름에 맞는 dict의 value에 1씩 추가해준다.
들어가는 report를 set으로 만들어주는 이유는 중복을 제거하기 위해서이다.
이렇게 하면 if문을 사용하지 않고도 개수를 추가해줄 수 있다.
신고받은 이름은 report에서 split해서 만들어주면 1번 인덱스에 있으므로 r.split()[1]과 같이 써준다. 그러면 신고받은 이름이 reports의 괄호 안에 들어간다.
for r in set(report):
reports[r.split()[1]] += 1
print(reports)
> {'muzi': 1, 'frodo': 2, 'apeach': 0, 'neo': 2} #신고당한 유저들이 받은 신고 횟수
이제 마지막으로 for 루프를 돌면서 '신고한' 유저에게 결과를 돌려주면 된다.
신고한 유저는 report 리스트의 r.split()[0]에 있을 것이다. 따라서 reports에 있는 결과가 k번이 넘어갈 경우 r.split()[0]의 이름이 있는 인덱스에 1을 더해주면 간단하게 문제를 풀 수 있다.
for r in set(report):
if reports[r.split()[1]] >= k: #만약에 그 유저가 신고당한 횟수가 k번이 넘어간다면
answer[id_list.index(r.split()[0])] += 1 #신고한 유저에게 메일 추가
해싱을 이용한다는 아이디어가 떠오른다면 짧게 코드를 짤 수 있지만, 아니라면 리스트로 풀려고 힘이 좀 쓰였을 것이다.
자료구조를 공부하며 해싱의 의미와 dict 구조를 잘 알아두도록 하자. 해싱은 특히 문자열과 숫자를 동시에 다룰 때 유용하게 쓰인다.
반응형