본문 바로가기
기타/알고리즘

(JS) Set [Programmers - 신고 결과 받기]

by 가나닩 2024. 10. 1.

문제를 풀기위해 아래와 같은 요소들을 고려하였다.

  1. 중복 report는 1개로 처리하므로 report에서 Set을 이용해 중복을 제거하여 사용했다.
  2. 유저별 신고받은 횟수, 처리 결과를 받을 횟수 객체를 따로 만들어 인덱스로 접근가능하게 했다.
더보기
function solution(id_list, report, k) {
    let reports = [...new Set(report)];
    let reported = {}
    let response = {}

    id_list.forEach((val,idx) => {
        reported[val] = 0;
        response[val] = 0;
    })

    reports.forEach((val,idx) => {
        let [, reportedUser] = val.split(" ");
        reported[reportedUser]++;
    })

    reports.forEach((val,idx) => {
        let [reporter, reportedUser] = val.split(" ");
        if(reported[reportedUser] >= k) {
            response[reporter]++;
        }
    })

    var answer = Object.values(response);
    return answer;
}

 

 

• Set

자바스크립트의 Set는 배열과 비슷하지만 다른 구조를 가진 데이터의 집합이다.

  • 중복 제거 : 중복 값을 허용하지 않는다. 중복된 데이터가 추가되면 자동으로 제거된다.
  • 인덱스가 없음 : 일반 배열과 다르게 요소별로 인덱스가 존재하지 않아 인덱스로 항목에 접근할 수 없다.
  • 삽입 순서 유지 : 인덱스는 없지만 데이터가 추가된 순서대로 저장되어 있어 반복문을 통한 순차적 접근은 가능하다.
  • 모든 데이터 타입 허용 : 숫자나 문자열 같은 원시값 뿐만 아니라 객체와 같은 참조 타입도 저장이 가능하다.
  • 빠른 자료 연산 : 값의 추가, 삭제, 조회, 중복제거 등의 작업을 편하고 빠르게 할 수 있다.

여기서 중복 제거 특징을 활용하면 배열의 중복항목을 빠르게 제거하는데 사용할 수 있다.

let arr = [1,2,2,3,3,3,1,4,2];
let report = [...new Set(arr)];

console.log(report);  // [1, 2, 3, 4]

 

 

 

※ Map

다른 사람의 풀이에서는 Map을 활용했다. 전체적인 코드 맥락은 같았지만 일반 객체를 활용하느냐 Map 객체를 활용하느냐의 차이였다.

 

Set 객체가 배열과 비슷하면서도 다른 구조였듯이 Map 객체는 일반 객체와 비슷하면서도 다른 구조를 지닌다.

  • 모든 타입값 키로 사용 가능 : 객체, 함수, 원시값 등 모든 데이터 타입을 키로 사용할 수 있다.
  • 삽입 순서 유지 : 키가 추가된 순서대로 저장되어있어 순차접근이 가능하다. 이는 ES6 에서 일반객체도 가능하다.
  • 빠른 자료 연산 : 대량의 데이터에 대해서 추가, 삭제, 조회 등의 작업을 편하고 빠르게 할 수 있다.
  • 반복 : forEach, for...of 등 다양한 반복 메서드를 지원한다. 일반 객체는 사용이 불가능하다.

동적 데이터를 자주 추가, 제거 하거나 다양한 타입의 값을 키로 활용해야할때 사용하기 좋다.