유저 - 한번에 1유저 신고 가능
동일유저 여러번 신고해도 신고횟수는 1회로 처리됨.
k번 이상 신고된 유저 - 정지
이 유저를 신고한 모든 유저에게 메일로 정지사실 알림.
리턴값 : 각 유저별로 처리 결과 메일을 받은 횟수를 담은 배열
id_list
: 유저 ID (배열)reported[신고당한 유저 인덱스]
= 신고한 사람 id목록 (2차원 배열)result
: 각 유저별로 처리 결과 메일을 받은 횟수 (배열)처음에는 [유저 : 유저가 신고한 id목록]
와 같은 형식을 생각하였다. 하지만, 신고당한 횟수를 계산하거나 신고한 유저를 찾아낼때 더 편리하기 위해 [신고당한 유저 : 신고한 사람들 id목록]
으로 표현하도록 했다.
id_list
["muzi", "frodo", "apeach", "neo"]
id
{"muzi":0, "frodo":1, "apeach":2, "neo":3}
딕셔너리를 사용하여 유저의 인덱스를 알아내기 쉽도록 했다.
# 입력예시
# report
["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
입력받은 report
배열을 돌며 아래처럼 신고한 사람들을 id목록을 담은 reported
(2차원 배열)을 완성시킨다.
단, 한 번 신고한 사람은 또 신고해도 1회로 처리되기 때문에 이미 신고한 사람 배열에 있으면 아무것도 하지않고 넘어가도록 한다.(continue)
reported
배열
인덱스(신고당한사람) | 신고한 사람 |
---|---|
0 | ["appeach"] |
1 | ["muzi", "appeach"] |
2 | [] |
3 | ["frodo", "muzi"] |
[
["appeach"],
["muzi", "appeach"],
[],
["frodo", "muzi"]
]
reported
의 value(배열)reported
의 value(배열)의 길이result
reported
배열을 돌며 신고당한 횟수가 k
번 이상이라면, 신고한 사람의 목록에 있는 사람들의 카운트(result[신고한사람의 인덱스]
)를 1 증가시킨다.
# result 예시
[2,1,1,0]
최종적으로 result
를 리턴한다.
def solution(id_list, report, k):
l = len(id_list)
reported = [[] for _ in range(l)] # 유저별 신고한사람들의 id목록
result = [0 for _ in range(l)] # 유저별 메일받은 횟수
# 0. 딕셔너리 생성 {유저id : 인덱스}
id = {}
for i in range(l):
id[id_list[i]] = i
# 1. 신고 처리
# 신고당한사람 : [신고한 사람1, 2, ...]
for str in report:
a, b = str.split(" ")
if a in reported[id[b]]:
continue
else:
reported[id[b]].append(a)
# 2. 정지 처리 (k번 이상 신고당한 사람)
for arr in reported:
if len(arr) >= k:
# 3. 메일 발송 횟수 계산
for user in arr:
result[id[user]] += 1
return result
def solution2(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
요구사항을 구현하는것에만 집중하지말고 코드를 최적화할 수 있는 방법을 좀 더 깊이 생각하고 설계한 후에 구현해야겠다.