set.has
set객체는 중복되지 않는 유일한 값들의 집합이다.
배열과 유사하지만
중복된요소를 가질 수 없다는점,
순서에 의미가 없다는 점,
인덱스로 접근이 불가능하다는 점이 다르다.
Set은 수학적 집합을 구현하기위한 자료구조이다.
여집합, 차집합, 교집합, 합집합 등을 구현할 수 있다.
Set 객체 생성
set 생성자 함수로 생성한다. 함수에 전달된 인수가 없다면 빈 Set객체가 생성된다.
중복된 배열을 인수로 준다면 저장되지 않는다.
Set의 프로토타입을 살펴보면 다양한 메서드들이 있는데
이번 코플릿 문제에서 Set.has을 활용한 문제가 있었다
🏋🏽문제
두 개의 배열(base,sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴
Set.has는 Set객체에 특정 요소 존재 여부를 확인하고 boolean값을 리턴한다.
처음에 sample을 그대로 인자로 주었다가 계속 false가 나왔다.
배열 그 자체는 특정"요소" 그 자체이므로 [1]이 아니라 1이 들어있는게 맞다.
[[1],2,3,4,5]라면?
false가 나와서 당황했다.
알아보니 같은 배열의 값이라 하더라도
has메소드에 배열을 인자로 전달하면
다른 참조값을 가지는 별개의 객체이기 때문에 false가 반환되는것이었다.
const isSubsetOf = function (base, sample) {
const setBase = new Set(base)
return sample.every(el=>setBase.has(el))
};
시간 복잡도를 고려하여 새로 작성한 코드이다.
every 메소드는 각 요소가 주어진 함수에 의해 제공된 테스트를 통과하는지 여부를 리턴한다.
첫번째 구현에서는 set.has 매소드가 sample배열의 각 요소를 하나씩 검사했고
두번째 구현에서는 every메소드가 sample배열의 모든 요소를 순회하면서
각 요소가 'setBase' Set 객체에 존재하는지 검사한다.
every메소드는 하나라도 false가 나오면 바로 false를 리턴한다.
만약 sample배열이 base의 부분집합이 아니라면
마지막 부분인 setBase.has(el)부분에서 false가 반환되어 검사가 중단되고 false를 리턴한다.