id순서배열과 신고내역 배열, 정지기준이 인자로 들어오고, 피신고인의 피신고량이 정지기준을 넘기면 신고자에게 신고결과메일을 발송한다.
이때 모든 id_list에 대한 신고결과메일 발송량을 리턴하면 된다.
function solution(id_list, report, k) {
var answer = [];
//누가 누구들을 신고했는지에 대한 배열
let reportArr = {}
//누가 누구들에게 의해서 신고당했는지에 대한 배열
let reportedArr = {}
//각 id마다 신고, 피신고 배열을 만들어 객체에 넣어줌
id_list.forEach((id) => {
reportArr[id] = []
reportedArr[id] = []
})
//신고목록에 대한 반복 판별문
for (const submit of report) {
//신고자, 피신고자 구조분해할당
let [reportUserId, reportedUserId] = submit.split(' ')
//신고자가 이미 피신고인의 배열안에 있는지에 대한 flag
let flag = true;
//피신고자 배열의 해당인원 배열탐색
for (let i = 0; i<reportedArr[reportedUserId].length; i++) {
//신고인이 해당 반복의 이름과 같지 않다면 다음이름 탐색
if (reportUserId !== reportedArr[reportedUserId][i]) {
continue
} else {
//신고인이 해당 반복의 이름과 같다면 flag를 false로
flag = false;
break;
}
}
//만약 신고인이 피신고인 배열에 포함되어있지 않다면, 신고인을 피신고인 배열에 넣는다.
if (flag) reportedArr[reportedUserId].push(reportUserId);
//만약 피신고인이 신고인의 배열에 포함되어있지 않다면, 피신고인을 신고인 배열에 넣는다.
if (flag) reportArr[reportUserId].push(reportedUserId)
}
//각 신고자마다의 결과메일개수를 담아줄 객체를 생성해준다.
let successfulBan = {}
id_list.forEach((id) => successfulBan[id] = 0)
//신고, 피신고객체의 순서 및 길이는 id_list와 같기때문에 id_list 기준으로 반복문 실행
for (const id of id_list) {
//만약 신고개수가 정지기준이상이라면
if (reportedArr[id].length >= k) {
//피신고자객체에서 해당 id값의 신고자목록을 탐색한다.
for (let j = 0; j<reportedArr[id].length; j++) {
//신고결과메일객체에서 신고자의 값에 1을 더해준다.
successfulBan[reportedArr[id][j]] = successfulBan[reportedArr[id][j]] + 1
}
}
}
for (const id of id_list) {
//신고결과메일객체 앞에서부터 순서대로 answer에 push해준다.
answer.push(successfulBan[id])
}
//신고결과값이 담긴 배열 answer을 리턴
return answer;
}
깔끔하게 통과되었다. 이전 알고리즘 문제에서 includes를 사용했을 때 런타임에러가 발생해서 이번엔 완벽히 반복문으로 수행했다.
다만, 신고내역에서 중복을 거르는 부분이 조금 걸리긴 한다.
let realReportList = new Set(report)
Set을 사용하면 중복값을 쉽게 제거할 수 있어 다음에 중복을 걸러야 할 때에는 Set을 생각해보도록 하자.
알고리즘을 풀이하며 객체를 생성하기 쉬운 Map을 주로 사용했었다.
하지만 Map의 값을 조정하는데는 메서드의 이용이 필수불가결하여 객체를 주로 사용해보고자 한다.
그리고 오늘 객체의 값에 배열을 넣어 접근 후 반복문 사용을 하려고 했으나 오류가 발생했었다.
직접적으로 객체에 forEach를 사용했기 때문이다.
객체는 for문이나 for of를 사용하여 객체의 특정키값에 접근하도록 하자.
'2차 공부 > 알고리즘' 카테고리의 다른 글
JadenCase 문자열 만들기 (0) | 2024.07.08 |
---|---|
최댓값과 최소값 (0) | 2024.07.05 |
공원 산책 (0) | 2024.07.03 |
달리기 경주 (0) | 2024.07.02 |
개인정보 수집 유효기간 (0) | 2024.07.01 |