프로그래머스 레벨1 - 신고결과받기
고수분이 올려주신 정답해설코드.
function solution(id_list, report, k) { const reportSet = new Set(report); const reportedCount = {}; const reportedBy = {}; const mailCount = {}; id_list.forEach((element) => { reportedCount[element] = 0; mailCount[element] = 0; reportedBy[element] = []; }); reportSet.forEach((element) => { const [id, reported] = element.split(" "); reportedCount[reported] += 1; reportedBy[reported].push(id); }); for (const reportedId in reportedCount) { if (reportedCount[reportedId] >= k) { reportedBy[reportedId].forEach((reporter) => { mailCount[reporter] += 1; }); } } return id_list.map((id) => mailCount[id]); }
const id_list = ['muzi', 'frodo', 'apeach', 'neo']; const report = ['muzi frodo', 'apeach frodo', 'frodo neo', 'muzi neo', 'apeach muzi'];
- id_list - 전체 id
- report의 첫번째 id - 신고한 id
- report의 두번째 id - 신고된 id
- k번이상 신고된 id는 신고되고 신고한 id에 신고결과메일이 발송된다.
- 같은 id의 중복신고는 1회신고한것으로 처리한다.
- id당 신고결과메일을 몇회받는지 배열을 반환한다.
const reportSet = new Set(report);
const reportedCount = {}; //{"id": Number(count)}
const reportedBy = {}; //{"id":[]}
const mailCount = {}; //{"id":Number(count)}
reportSet
- report를 set을 이용하여 중복을제거.
reportedCound
- 각 id당 신고당한 횟수
reportedBy
- 각 id를 신고한 사람의 배열을 저장.
mailCount
- 신고한 id가 받을 메일 수.
id_list.forEach((element) => {
reportedCount[element] = 0;
mailCount[element] = 0;
reportedBy[element] = [];
});
id_list
의 각 요소(id)를 각 객체의 key로 설정하고 value에 기본값으로 0이나 배열을 설정하여 오브젝트 객체를 완성한다.reportSet.forEach((element) => {
const [id, reported] = element.split(" ");
reportedCount[reported] += 1;
reportedBy[reported].push(id);
});
reportSet
에 forEach로 각 요소를 선택해 split()
로 공백 기준으로 앞뒤를 나눈다. id
, reported
라는 변수에 저장한다.reportedCount
객체에 reported
변수를 사용해서 key를 찾고 value에 1씩 더해준다.reportedBy
객체에도 배열에 id를 추가한다.point 🔍
내장함수로 값을 반환함과 동시에 변수로 저장하기.
반환된 앞, 뒤 값을 각각 변수로 생성할 수 있다.
for (const reportedId in reportedCount) {
if (reportedCount[reportedId] >= k) {
reportedBy[reportedId].forEach((reporter) => {
mailCount[reporter] += 1;
});
}
}
reportedCount
를 돌며 value값이 k보다 크면 reportedBy
의 값(배열)을 각각 mailCount
의 key를 찾는데 사용해서 mailCount
의 값에 1씩 더해준다.
point 🔍
objname[~~~]
은 '~~~'으로 objname객체의 Key를 찾고, value값을 반환해준다.
return id_list.map((id) => mailCount[id])
id_list
의 id순서대로 메일 수를 결과로 나타내기 위해 map
을 사용, mailCount
에 저장된 value로 id_list
의 요소를 치환해준다.
map
은 배열 안의 각 원소를 변환 할 때 사용 되며, 이 과정에서 새로운 배열이 만들어지는 배열 내장함수이다.