오늘의 알고리즘 👍
📝 1. 신고 결과 받기
- 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
▷ 입출력 예
solution(["muzi", "frodo", "apeach", "neo"], ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"], 2)
solution(["con", "ryan"], ["ryan con", "ryan con", "ryan con", "ryan con"], 3)
▷ 내 풀이
function solution(id_list, report, k) {
let answer = [];
let result = [];
for (let i = 0; i < report.length; i++) {
answer.push(report[i].split(' '));
for (let j = 0; j < report.length; j++) {
answer[i][1] === answer[j][1] ? (result[i] += 1) : -1;
}
}
return answer;
}
▷ 해결 못함 ❌
▷ 수업 풀이
function solution(id_list, report, k) {
const reporter = {};
const users = {};
const answer = [];
report = [...new Set(report)];
for (let i = 0; i < report.length; i++) {
const info = report[i].split(' ');
if (!reporter[info[0]]) {
reporter[info[0]] = [];
}
if (!users[info[1]]) {
users[info[1]] = 0;
}
reporter[info[0]].push(info[1]);
users[info[1]]++;
}
for (let i = 0; i < id_list.length; i++) {
const reporterList = reporter[id_list[i]] || [];
answer[i] = 0;
for (let j = 0; j < reporterList.length; j++) {
if (users[reporterList[j]] >= k) {
answer[i]++;
}
}
}
return answer;
}
▷ reduce, map 매서드 사용 풀이
function solution(id_list, report, k) {
const reporter = {};
report = [...new Set(report)];
const users = report.reduce((acc, cur) => {
const info = cur.split(' ');
if (!reporter[info[0]]) {
reporter[info[0]] = [];
}
if (!acc[info[1]]) {
acc[info[1]] = 0;
}
reporter[info[0]].push(info[1]);
acc[info[1]]++;
return acc;
}, {});
return id_list.map((id) => {
const arr = reporter[id];
return (arr || []).reduce((acc, cur) => {
return acc + (users[cur] >= k ? 1 : 0);
}, 0);
});
}
- 어떠한 데이터를 종합해서 문제를 풀어야 할 때는 객체를 이용하면 편리하다.
출처: 프로그래머스
출처: 코드캠프