코드
def solution(id_list, report, k):
dict = {i:[] for i in id_list} # 유저ID : 신고한 ID
stop = {i:0 for i in id_list} # 유저별 신고 당한 횟수
for re in set(report): # set으로 중복 제거
dict[re.split()[0]].append(re.split()[1])
stop[re.split()[1]] += 1
stop_id = [] # 정지된 ID
for key, value in stop.items():
if value >= k:
stop_id.append(key)
answer = [] # 처리 결과 메일 수신 횟수
for i in range(len(id_list)):
temp = 0 # 메일 수신 횟수
for s in stop_id:
if s in dict[id_list[i]]: # 정지된 ID가 해당 유저가 신고한 내역에 있으면
temp += 1
answer.append(temp)
return answer
먼저 주어진 id_list를 이용해서 유저 ID:신고한 ID 형태의 딕셔너리와 유저 ID:0 형태의 딕셔너리 두 개를 만든다.
dict는 해당 유저가 신고한 유저 ID를 나타내는 것이고, stop은 유저별 신고당한 횟수를 저장한다.
그다음으로 report를 이용해 dict에는 신고한 ID를, stop에는 신고당한 횟수를 value에 각각 추가한다.
문제에서 동일한 유저에 대한 신고 횟수는 1회로 처리한다고 알려주었으므로 set()을 이용하여 중복을 제거하여 for문을 돌 수 있다.
dict = {i:[] for i in id_list}
stop = {i:0 for i in id_list}
for re in set(report):
dict[re.split()[0]].append(re.split()[1])
stop[re.split()[1]] += 1
k번 이상 신고된 유저는 정지가 되므로 정지된 ID를 찾는다.
stop에서 key(=유저 ID), value(=신고당한 횟수)를 가져와 해당 value가 k 이상이면 stop_id에 추가하여 정지된 계정을 파악한다.
stop_id = [] # 정지된 ID
for key, value in stop.items():
if value >= k:
stop_id.append(key)
정지된 ID를 찾았으므로, 어떤 유저가 신고했는지 찾아 메일을 보내면 된다.
return 하는 배열은 id_list에 담긴 id 순서대로 메일 수를 저장하므로 id_list를 순서대로 for문으로 방문한다.
정지된 ID가 해당 유저가 신고한 ID에 포함되어 있으면 temp+1을 통해 메일 수신 횟수를 카운트해주고 순서대로 answer에 추가해 메일 수신 횟수를 저장한다.
answer = [] # 처리 결과 메일 수신 횟수
for i in range(len(id_list)):
temp = 0 # 메일 수신 횟수
for s in stop_id:
if s in dict[id_list[i]]: # 정지된 ID가 해당 유저가 신고한 내역에 있으면
temp += 1
answer.append(temp)
최대한 문제 설명에 있는 대로 따라가기 위해 구현하다 보니 누가 봐도 초짜인 티가 팍팍 나는 코드이다..ㅎ
다른 사람의 코드
def solution(id_list, report, k):
answer = [0] * len(id_list) # 메일 수신 횟수
stop = {x : 0 for x in id_list} # 유저ID:신고 당한 횟수
# 신고 당한 횟수 카운트
for r in set(report):
stop[r.split()[1]] += 1
# 메일 수신 횟수 카운트
for r in set(report):
if stop[r.split()[1]] >= k:
answer[id_list.index(r.split()[0])] += 1
return answer
내가 쓴 코드에서 불필요한 부분이 모두 제거된 아주아주 깔끔한 방법이다.
사전에 answer를 id_list 길이와 같게 만들어두고, 딕셔너리도 유저 ID:신고당한 횟수 형태의 stop 하나만 만든다.
그다음으로 중복을 제거한 set(report)에서 신고당한 ID를 파악해 stop에 횟수를 반영해 준다.
신고당한 횟수가 모두 반영되었으면 이제 k번 이상 신고된 ID를 찾는다.
k번 이상 신고된 ID를 찾아 신고한 사람(=r.split[0])의 index를 id_list에서 찾아 answer의 같은 위치에 메일 수신 횟수를 +1 해준다.