def solution(id_list, report, k):
id_bad = {}
id_mail = {}
answer = {}
for id in id_list : # 1
id_bad[id] = 0
id_mail[id] = []
answer[id] = 0
for re in report :
a = re.split(' ')[0]
b = re.split(' ')[1]
if b not in id_mail[a] :
id_bad[b] += 1 # 2
id_mail[a].append(b) # 3
for key, val in id_bad.items() : # 4
if val < k :
continue
for m_key, m_val in id_mail.items() :
if key in m_val :
answer[m_key] += 1
return list(answer.values())
나의 풀이는 아주 단순하게 생각했다.
1. 딕셔너리 형태로 바꾸기 (인덱스를 문자로 사용하기 위해)
2. 캐릭터 별 신고 당한 횟수
3. 누굴 신고했는지
4. 신고당한 횟수가 k 이상일 때 3번 딕셔너리(id_mail)에 해당 캐릭터가 있는지 확인
코드가 너무 길고 필요 없는 코드가 많다.
다른 사람의 코드를 살짝 읽어보고 참고하여 새롭게 코드를 작성해봤다.
def solution(id_list, report, k):
id_bad = {id : 0 for id in id_list} # 1
answer = [0] * len(id_list) # 2
for re in set(report) : # 3
id_bad[re.split(' ')[1]] += 1 # 4
for re in set(report) : # 5
if id_bad[re.split(' ')[1]] >= k : # 6
answer[id_list.index(re.split(' ')[0])] += 1
return answer
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
로 인해 한 유저가 동일한 유저를 여러 번 신고할 경우가 있으므로 set을 통해 중복을 제거한다.re.split(' ')[0]
신고한 유저의 이름으로 id_list.index()
으로 인덱스 값을 얻을 수 있다.function solution(id_list, report, k) {
const reportSet = [...new Set(report)];
const bad = new Array(id_list.length).fill(0);
for (let i=0; i<reportSet.length; i++) {
bad[id_list.indexOf(reportSet[i].split(' ')[1])] += 1
}
const good = new Array(id_list.length).fill(0);
for (let i=0; i<reportSet.length; i++) {
good[id_list.indexOf(reportSet[i].split(' ')[0])] += bad[id_list.indexOf(reportSet[i].split(' ')[1])] >= k ? 1 : 0;
}
return good;
}
[...new Set(report)]
new Array(n).fill(0)
array.indexOf(특정값)