https://programmers.co.kr/learn/courses/30/lessons/92334
function solution(id_list, report, k) {
var answer = [];
const cnt = id_list.length;
let idList = {};
resetIdList(idList, id_list, cnt);
let checkList = {};
setCheckList(checkList, id_list, cnt);
makeCheckList(checkList, report, cnt);
countReport(idList, checkList, cnt);
let banList = [];
makeBanList(banList, idList, id_list, cnt, k);
resetIdList(idList, id_list, cnt);
countBanResponse(idList, checkList, banList,report);
answer = Object.values(idList)
return answer;
}
function countBanResponse(idList, checkList, banList){
const keyList = Object.keys(checkList);
for(let i=0;i<keyList.length;i++){
const key = keyList[i];
const item = [...checkList[key]]
for(let j=0;j<banList.length;j++){
if( item.indexOf(banList[j])!=-1){
idList[key] += 1;
}
}
}
}
function makeBanList(banList, idList, id_list, cnt, k){
for(let i=0;i<cnt;i++){
if(idList[id_list[i]] >= k){
banList.push(id_list[i])
}
}
}
function countReport(idList, checkList){
const keyList = Object.keys(checkList);
for(let i=0;i<keyList.length;i++){
const key = keyList[i];
const item = [...checkList[key]]
for(let j=0;j<item.length; j++){
idList[item[j]] += 1;
}
}
}
function makeCheckList(checkList, report){
for(let i=0;i<report.length;i++){
const fst = report[i].split(' ')[0];
const scd = report[i].split(' ')[1];
checkList[fst].add(scd);
}
}
function setCheckList(checkList, id_list, cnt){
for(let i=0;i<cnt;i++){
checkList[id_list[i]] = new Set();
}
}
function resetIdList(idList, id_list, cnt){
for(let i=0;i<cnt;i++){
idList[id_list[i]] = 0;
}
}
const id_list= ["muzi", "frodo", "apeach", "neo"];
const report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"];
const k = 2;
console.log(solution(id_list, report, k) );
오랜만에 알고리즘을 풀어봤다.
문제 순서대로 차례차례 반복문을 써가다가 오히려 햇갈리는거 같아서 전부 메소드로 빼서 작성했다.
먼저 구성요소로는 정답을 저장할 배열 answer
숫자를 세고 저장해둘 idList
중복을 지우고 이름별로 신고한 값을 저장할 checkList
불량이용자 banList
이렇게 구성하였다.
function resetIdList(idList, id_list, cnt){
for(let i=0;i<cnt;i++){
idList[id_list[i]] = 0;
}
}
idList의 초기값을 set해줄 메소드이다.
이름별로 0을 세팅해준다.
각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
라고 문제에 나와있다.
그렇기 때문에 초기값은 이름별로 Set() 을 사용했다.
function setCheckList(checkList, id_list, cnt){
for(let i=0;i<cnt;i++){
checkList[id_list[i]] = new Set();
}
}
function makeCheckList(checkList, report){
for(let i=0;i<report.length;i++){
const fst = report[i].split(' ')[0];
const scd = report[i].split(' ')[1];
checkList[fst].add(scd);
}
}
CheckList를 만들어주는 메소드.
report의 각 배열의 값들을 split으로 나누어 해당 이름의 set에 추가하였다.
function countReport(idList, checkList){
const keyList = Object.keys(checkList);
for(let i=0;i<keyList.length;i++){
const key = keyList[i];
const item = [...checkList[key]]
for(let j=0;j<item.length; j++){
idList[item[j]] += 1;
}
}
}
각 이름별로 신고당한 횟수를 idList에 count한다.
function makeBanList(banList, idList, id_list, cnt, k){
for(let i=0;i<cnt;i++){
if(idList[id_list[i]] >= k){
banList.push(id_list[i])
}
}
}
신고당한 횟수가 k번이 넘으면 banList에 추가한다.
function countBanResponse(idList, checkList, banList){
const keyList = Object.keys(checkList);
for(let i=0;i<keyList.length;i++){
const key = keyList[i];
const item = [...checkList[key]]
for(let j=0;j<banList.length;j++){
if( item.indexOf(banList[j])!=-1){
idList[key] += 1;
}
}
}
}
위에서 만든 checkList에서 banList에 포함된게 있다면 idList에 값을 count한다.
! 물론, 해당 메소드를 사용하기전 idList를 resetIdList로 초기화시켜준다.
처음에 2번에서 작성한 문제조건을 생각안하고 했다가 문제 제출에서 틀려버렸다.
제한시간이 있어 쫄았지만, 무사히 통과해서 다행이다.
문제를 잘 읽자.