이번 문제는 두개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지의 여부를 리턴하는 문제다. 또한 advanced로 base, sample의 길이가 10,000이상인 경우도 찾아보라고 했는데 일단 이를 생각지 않은채 기본 문제에만 집중하기로 했다.
let base = [1, 2, 3, 4, 5];
let sample = [1, 3];
let output = isSubsetOf(base, sample);
console.log(output); // --> true
sample = [6, 7];
output = isSubsetOf(base, sample);
console.log(output); // --> false
base = [10, 99, 123, 7];
sample = [11, 100, 99, 123];
output = isSubsetOf(base, sample);
console.log(output); // --> false
난 여전히 고차적 생각은 하지 못한채 이중 포문을 써서 문제를 풀었다.
const isSubsetOf = function (base, sample) {
let length = sample.length;
let count = 0;
for(let i = 0; i < sample.length; i++){
for(let j = 0; j < base.length; j++){
if(sample[i] === base[j]){
count++;
continue;
}
}
if(count === length){
return true;
}
}
return false;
};
문제는 비교적 빨리 풀었으나 또다시 레퍼런스를 본 순간 허탈함이 찾아왔다.
const isSubsetOf = function (base, sample) {
return sample.every((item) => base.includes(item));
메소드를 활용하여 내가 만든 수많은 코드들을 단 한줄로 축약했다.
every() method는 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트한다.
활용하기 쉬운 메소드이므로 반드시 숙지하여야겠다.
const isSubsetOf = function (base, sample) {
base.sort((a, b) => a - b);
sample.sort((a, b) => a - b);
const findItemInSortedArr = (item, arr, from) => {
for (let i = from; i < arr.length; i++) {
if (item === arr[i]) return i;
else if (item < arr[i]) return -1;
}
return -1;
};
let baseIdx = 0;
for (let i = 0; i < sample.length; i++) {
baseIdx = findItemInSortedArr(sample[i], base, baseIdx);
if (baseIdx === -1) return false;
}
return true;
};