문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
Object.entries()를 사용할 때 예시 1보다 예시 2처럼 코드를 작성하는 편이 가독성이 더 높다.
// 예시 1: Object.entries()로 객체를 배열 형태로 변형해서 사용한다
blockedUserObj = Object.entries(blockedUserObj);
blockedUserObj.forEach(user => {
const blockedUser = user[0];
const reportedCount = user[1];
if (reportedCount >= k) blockedUserList.push(blockedUser);
});
// 예시 2: for문 자체에서 Object.entries()를 사용한다
for (const [key, value] of Object.entries(blockedUserObj)) {
const blockedUser = key;
const reportedCount = value;
if (reportedCount >= 2) blockedUserList.push(blockedUser);
}
정답
function solution(id_list, report, k) {
// 신고 명단에서 한 유저가 동일한 유저를 중복 신고한 경우를 필터링한다
const set = new Set(report);
const uniqueReport = [...set];
let userObj = {};
let reportedUserObj = {};
// 신고한 유저 명단, 신고당한 유저 명단을 객체로 만든다
uniqueReport.forEach(item => {
const user = item.split(" ")[0];
const reportedUser = item.split(" ")[1];
if (userObj[user]) {
userObj[user].push(reportedUser);
} else {
userObj[user] = [reportedUser];
}
if (reportedUserObj[reportedUser]) {
reportedUserObj[reportedUser] += 1;
} else {
reportedUserObj[reportedUser] = 1;
}
});
// 신고당한 유저 명단에서 k회 이상 신고된 유저들을 차단된 유저 명단에 추가한다
const blockedUsers = [];
for (const [key, value] of Object.entries(reportedUserObj)) {
const blockedUser = key;
const reportedCount = value;
if (reportedCount >= k) blockedUsers.push(blockedUser);
}
// 정답 배열을 유저의 길이 만큼 만든 뒤, 우선 0으로 채운다
let answer = new Array(id_list.length).fill(0);
// 신고한 유저 명단을 순회한다
// for문 안에서 유저가 신고한 유저의 수만큼 또 순회한다
// 유저가 신고한 유저가 차단된 유저 명단에 포함되어 있는 경우:
// 해당 유저 인덱스에 1을 더한다
for (const [key, value] of Object.entries(userObj)) {
const user = key;
const reportedUsers = value;
for (let j = 0; j < reportedUsers.length; j++) {
const reportedUser = reportedUsers[j];
const userIndex = id_list.indexOf(user);
if (blockedUsers.includes(reportedUser)) {
answer[userIndex] += 1;
}
}
}
return answer;
}