1. answer 배열 초기화 하기
우선 결과로 반환할 answer 배열을 알맞은 길이만큼 0으로 초기화 해야한다.
자바스크립트 배열 생성 & 초기화 한번에 하기 (velog.io)
위 블로그에서는 배열의 생성과 초기화를 동시에 하는 방법으로 두가지를 소개하고 있는데, 첫번째는 직접 초기화 하는 방법이며, 두번째는 from 메서드를 이용하여 초기화하는 방법이다.
Array.from() - JavaScript | MDN (mozilla.org)
문서에는 "Array.from() 메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듭니다" 라고 소개되어 있다.
얕은 복사 & 깊은 복사
먼저, 얕은 복사와 깊은 복사의 개념부터 다시 짚고 넘어가보자.
[JavaScript] 참조 복사와 값 복사 (얕은 복사와 깊은 복사) (tistory.com)
위 링크에 따르면 값을 복사해오느냐, 객체를 참조하느냐에 따라 얕은 복사와 깊은 복사를 구분한다. 아무튼 Array.from()은 어떤 유사 배열 객체나 반복 가능 객체를 만들어 참조하는 모양이다.
유사 배열 객체 & 반복 가능한 객체
[JavaScript] 반복 가능 객체 (Iterable object), 유사 배열 객체 (Array-like object) (tistory.com)
위 링크에 기가막히게 설명이 잘 되어있다.
먼저 유사 배열 객체란, length property를 가지고 있는 객체를 말한다.
반복 가능한 객체란, 여러 가지 조건이 있지만, 사용되는 예로는 전개 연산자(Spread Operator), 제네레이터(Generator)의 yield*, 구조 분해 할당(Destructing Assignment)가 있다고 한다.
2. 신고한 회원, 신고당한 횟수 리스트
나중에 신고한 회원의 처리가 어떻게 되었는지 결과를 받기 위해, 각 회원마다 pending 이라는 리스트를 주고 신고한 회원의 index를 넣어준다.
또 k 번 이상 신고당했는지 검사하기 위해, 각 회원마다 신고당한 횟수인 reportedNum을 준다.
이 때, 한 회원이 같은 회원을 여러번 신고하는것은 카운트하지 않으므로, set을 이용해 중복을 제거해준다.
이제 반복문을 돌면서 각 회원의 pending과 reportedNum을 채워줘야한다. solution 함수에 인자로 전달된 report를 이용하면된다. 공백을 기준으로 파싱되며, 첫번째 문자열은 신고자, 두번째 문자열은 피신고자이다.
JavaScript - 배열에서 중복 제거, 4가지 방법 (codechacha.com)
중복을 제거하는데는 여러가지 방법이 존재하지만, 이번엔 set을 이용했다.
Array.prototype.forEach() - JavaScript | MDN (mozilla.org)
문서에 따르면, "forEach()는 주어진 callback을 배열에 있는 각 요소에 대해 오름차순으로 한 번씩 실행합니다. 삭제했거나 초기화하지 않은 인덱스 속성에 대해서는 실행하지 않습니다. (예: 희소 배열)" 라고 한다.
[javascript] 문자열 자르기 - split(), 부분 문자열 추출하기 - substring() (tistory.com)
공백을 기준으로 문자열을 잘라야 해서, split을 사용하였다.
3. 정지된 회원, 결과 답신
앞에서 각 회원이 신고한 회원의 인덱스를 모두 저장해놨기 때문에, k번 이상 신고된 회원의 인덱스를 파악하여 비교해보기만 하면 된다.
코딩벌레 :: [JS] 배열속 원하는 값 찾기(indexOf, includes) (tistory.com)
배열 요소간 포함관계를 알아내는 방법은 여러가지가 있겠지만, 이번에는 includes와 반복문 두번으로 구현하였다.
코드
function solution(id_list, report, k) {
let answer = Array.from({length: id_list.length}, () => 0);
let userList = Array.from({length: id_list.length}, () => {return {pending: [], reportedNum: 0}});
let newReport = [...(new Set(report))];
console.log(newReport);
newReport.forEach(function (item) {
let ary = item.split(" ");
let idxA = id_list.indexOf(ary[0]);
let idxB = id_list.indexOf(ary[1]);
userList[idxA].pending.push(idxB);
userList[idxB].reportedNum += 1;
});
let suspendedIdList = [];
userList.forEach(function (item, index) {
if (item.reportedNum >= k) {
suspendedIdList.push(index);
}
});
userList.forEach(function (item, index) {
for (suspendedId of suspendedIdList) {
if (item.pending.includes(suspendedId)) {
answer[index] += 1;
}
}
});
console.log(userList);
return answer;
}
'PS > 프로그래머스' 카테고리의 다른 글
소수 만들기 (lv1) (0) | 2022.07.03 |
---|---|
키패드 누르기 (lv1) (0) | 2022.07.02 |
숫자 문자열과 영단어 (lv1) (0) | 2022.07.01 |
신규 아이디 추천 (lv1) (0) | 2022.07.01 |
로또의 최고순위와 최저순위 (lv1) (0) | 2022.06.30 |