친구 K 군과 함께하는 코테 알고리즘 도전기
언어는 js로 통일하고 매일 프로그래머스에서 1문제 씩 풀기로 했다.
● 문제해결아이디어
문제를 잘 읽어보면
1. 유저 목록을 주고
2. "신고한사람 신고당한사람" 이런 형식의 배열을 주고
3. K번 이상 신고가 되면, 신고한 사람과 당한 사람 모두에게 이메일을 준다
간단하게 생각해보면 좋을 것 같다.
1. 신고 당한 유저의 ID를 키 값으로 설정하고, [배열] 형태의 신고한 유저를 담는 오브젝트를 만든다.
2. 해당 오브젝트를 순회하면서 신고한 유저의 수를 세고, k 보다 높다면 각 이름에 +1 씩 하면 된다.
● 풀이
const id\_list = \["muzi", "frodo", "apeach", "neo"\];
const report = \[ "muzi frodo", "apeach frodo" , "frodo neo", "muzi neo", "apeach muzi"\];
const k = 2
const solution = (id\_list, report, k) => {
const result = new Array(id\_list.length); // 유저 수만큼 리스트를 만들고
result.fill(0); // 기본값은 0으로 채워준다.
const reportList = {}; // 신고당한 사람의 오브젝트를 만들고
id\_list.map((user) => {
reportList\[user\] = \[\] // 키 값은 유저 이름으로 만든다.
});
report.map((user) => { // 신고 리스트를 순회하면서
const \[userId, reportId\] = user.split(' '); // 신고한 유저, 당한 유저를 띄어쓰기 ' ' 로 분리하고
if (!reportList\[reportId\].includes(userId)) { // 만약 신고가 되어있지 않다면(이미 신고한 경우를 거를려고)
reportList\[reportId\].push(userId); // 아까 만든 신고당한사람 오브젝트에 신고한 사람 이름을 넣는다.
}
});
for(const key in reportList) { // 신고당한 사람 오브젝트를 순회하면서
if(reportList\[key\].length >= k) { // K 번 이상의 사람 이름이 들어가면
reportList\[key\].map((user) => { // 유저 이름 다 찾아서
result\[id\_list.indexOf(user)\] += 1; // 메일 리스트에 +1 씩 해준다.
})
}
}
return result;
}
console.log(solution(id\_list, report, k));