알고리즘 문제풀이(프로그래머스)
문제명 : 신고결과받기
링크 https://programmers.co.kr/learn/courses/30/lessons/92334
입력값
출력값
id_list = ["muzi","frodo","apeach","neo"]
report = ["muzi frode","apeach frodo","frodo neo","apeach muzi"]
k = 2
이면
[2,1,1,0]
왜 [2,1,10]이지?? 아래 내용을 참고
muzi가 신고한 frodo,neo는 신고를 2번 당했다. 2명이 2번이상 신고당해서 2
frodo가 신고한 neo 는 신고를 2번 당했다. 1명이 2번이상 신고당해서 1
apeach가 신고한 frode는 신고를 2번 당했다. 1명이 2번이상 신고당해서 1
neo는 슈퍼 민폐유저였는지 신고는 안하고 신고만 졸라당했다... 0
핵심포인트
해결과정
const answer = new Array(id_list.length).fill(0)
신고 정보에 대한 정보를 배열로 저장하고, 사람과 신고한 사람의 쌍으로 맞춰주자.
이때는 computed property를 사용하자
//해당 코드는 신고한사람 + 신고할 사람의 형식이다.
//서로 떨어뜨리기 위해서 split(' ')를 사용했다.
report.map(el => {
const [user_id,report_id] = el.split(' ')
})
report.map(el => {
const [user_id, report_id] = el.split(' ')
//한사람이 똑같은 사람을 여러번 신고해도 하나로 처리될수있게끔
//중복처리하는 것을 제거하는 과정
if (!report_list[report_id].includes(user_id)){
report_list[report_id].push(user_id)
}
for (const key in report_list){
if (report_list[key].length >= 2){
report_list[key].map(user => {
answer[id_list.indexOx(user)] += 1
})
}
}
이렇게 작성해주고 return해주면된다.
최종코드
function solution(id_list,report,k){
const answer = new Array(id_list.length)
answer.fill(0)
const report_list = {}
id_list.map((user)=> {
report_list[user] = []
//key로 userid를 value로 빈 배열을 가지는 객체이다.
})
report.map((user)=> {
const [user_id, report_id] = user.split(' ')
if (!report_list[report_id].includes(user_id)){
report_list[report_id].push(user_id)
})
for (const key in report_list){
if (report_list[key].length >= k){ //이용정지 유저
report_list[key].map((user)=> {
answer[id_list.indexOf(user)] += 1
})
}
}
return answer
}