PS/프로그래머스

신고 결과 받기 (lv1)

ForteQook 2022. 6. 27. 18:21

1. answer 배열 초기화 하기

우선 결과로 반환할 answer 배열을 알맞은 길이만큼 0으로 초기화 해야한다.

자바스크립트 배열 생성 & 초기화 한번에 하기 (velog.io)

 

자바스크립트 배열 생성 & 초기화 한번에 하기

따라서, 대표적 객체지향 언어인 자바와 마찬가지로 new Array()가 존재한다.new Array()의 첫번째 매개변수로 배열의 길이를 넘겨서 특정 길이로 배열의 생성은 할 수 있지만,초기값은 undefined로 설정

velog.io

위 블로그에서는 배열의 생성과 초기화를 동시에 하는 방법으로 두가지를 소개하고 있는데, 첫번째는 직접 초기화 하는 방법이며, 두번째는 from 메서드를 이용하여 초기화하는 방법이다.

Array.from() - JavaScript | MDN (mozilla.org)

 

Array.from() - JavaScript | MDN

Array.from() 메서드는 유사 배열 객체(array-like object)나 반복 가능한 객체(iterable object)를 얕게 복사해 새로운Array 객체를 만듭니다.

developer.mozilla.org

 

문서에는 "Array.from() 메서드는 유사 배열 객체(array-like object)반복 가능한 객체(iterable object)얕게 복사해 새로운Array 객체를 만듭니다" 라고 소개되어 있다.


얕은 복사 & 깊은 복사

먼저, 얕은 복사와 깊은 복사의 개념부터 다시 짚고 넘어가보자.

[JavaScript] 참조 복사와 값 복사 (얕은 복사와 깊은 복사) (tistory.com)

 

[JavaScript] 참조 복사와 값 복사 (얕은 복사와 깊은 복사)

자바스크립트 참조 복사와 값 복사 자바스크립트에서 = 를 이용하여 객체를 복사하면 값을 복사하는게 아니라 그 값의 위치를 참조만 하게 된다. 한번 자세히 알아보도록 하자. 자료형의 값 복

wanna-b.tistory.com

위 링크에 따르면 값을 복사해오느냐, 객체를 참조하느냐에 따라 얕은 복사와 깊은 복사를 구분한다. 아무튼 Array.from()은 어떤 유사 배열 객체나 반복 가능 객체를 만들어 참조하는 모양이다.

 

유사 배열 객체 & 반복 가능한 객체

[JavaScript] 반복 가능 객체 (Iterable object), 유사 배열 객체 (Array-like object) (tistory.com)

 

[JavaScript] 반복 가능 객체 (Iterable object), 유사 배열 객체 (Array-like object)

많은 프로그래밍 언어에서 그렇듯, JavaScript에도 iterable 객체와 iterator 객체의 개념이 존재한다. 여기서 iterable 객체란 반복 가능한 객체(for ... of 등의 문법을 이용하여 각 요소를 반복할 수 있는

it-eldorado.tistory.com

위 링크에 기가막히게 설명이 잘 되어있다.

 

먼저 유사 배열 객체란, length property를 가지고 있는 객체를 말한다.

반복 가능한 객체란, 여러 가지 조건이 있지만, 사용되는 예로는 전개 연산자(Spread Operator), 제네레이터(Generator)의 yield*, 구조 분해 할당(Destructing Assignment)가 있다고 한다.


2. 신고한 회원, 신고당한 횟수 리스트

 나중에 신고한 회원의 처리가 어떻게 되었는지 결과를 받기 위해, 각 회원마다 pending 이라는 리스트를 주고  신고한 회원의 index를 넣어준다.

 또 k 번 이상 신고당했는지 검사하기 위해, 각 회원마다 신고당한 횟수인 reportedNum을 준다.

 이 때, 한 회원이 같은 회원을 여러번 신고하는것은 카운트하지 않으므로, set을 이용해 중복을 제거해준다.

 이제 반복문을 돌면서 각 회원의 pending과 reportedNum을 채워줘야한다. solution 함수에 인자로 전달된 report를 이용하면된다. 공백을 기준으로 파싱되며, 첫번째 문자열은 신고자, 두번째 문자열은 피신고자이다.


JavaScript - 배열에서 중복 제거, 4가지 방법 (codechacha.com)

 

JavaScript - 배열에서 중복 제거, 4가지 방법

자바스크립트의 배열에서 중복 요소를 제거하는 방법을 소개합니다. Set는 중복 데이터 저장을 허용하지 않는 자료구조입니다. 이 특성을 이용하여 배열의 모든 요소를 Set에 추가하면 중복이 저

codechacha.com

 중복을 제거하는데는 여러가지 방법이 존재하지만, 이번엔 set을 이용했다.

 

Array.prototype.forEach() - JavaScript | MDN (mozilla.org)

 

Array.prototype.forEach() - JavaScript | MDN

forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.

developer.mozilla.org

 문서에 따르면, "forEach()는 주어진 callback을 배열에 있는 각 요소에 대해 오름차순으로 한 번씩 실행합니다. 삭제했거나 초기화하지 않은 인덱스 속성에 대해서는 실행하지 않습니다. (예: 희소 배열)" 라고 한다.

 

[javascript] 문자열 자르기 - split(), 부분 문자열 추출하기 - substring() (tistory.com)

 

[javascript] 문자열 자르기 - split(), 부분 문자열 추출하기 - substring()

자바스크립트에서 문자열을 자르거나 추출하는 방법입니다. 문자열 자르기 string.split( 구분자 ) 인자로 전달하는 구분자를 기준으로 문자열을 나눕니다. 결과는 배열로 반환됩니다. 구분자로 공

codingbroker.tistory.com

 공백을 기준으로 문자열을 잘라야 해서, split을 사용하였다.


3. 정지된 회원, 결과 답신

 앞에서 각 회원이 신고한 회원의 인덱스를 모두 저장해놨기 때문에, k번 이상 신고된 회원의 인덱스를 파악하여 비교해보기만 하면 된다.

 


코딩벌레 :: [JS] 배열속 원하는 값 찾기(indexOf, includes) (tistory.com)

 

[JS] 배열속 원하는 값 찾기(indexOf, includes)

자바스크립트에서 배열속 원하는 값을 찾고싶을때, indexOf 와 includes 를 이용하여 쉽게 찾을 수 있습니다. indexOf 는 찾은 값의 첫번째 원소의 위치를 반환해주며, 없을경우 -1을 리턴합니다. includes

dpdpwl.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