프로그래머스 level1. 신고결과받기

rlorxl·2022년 5월 10일
0

프로그래머스 레벨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);
});
  • set으로 중복없게 만들었던 reportSet에 forEach로 각 요소를 선택해 split()로 공백 기준으로 앞뒤를 나눈다.
  • 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 은 배열 안의 각 원소를 변환 할 때 사용 되며, 이 과정에서 새로운 배열이 만들어지는 배열 내장함수이다.

profile
즐겜하는거죠

0개의 댓글