두 개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴해야 합니다.
number 타입을 요소로 갖는 임의의 배열base.length는 100 이하number 타입을 요소로 갖는 임의의 배열sample.length는 100 이하boolean 타입을 리턴해야 합니다.base, sample 내에 중복되는 요소는 없다고 가정합니다.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);
<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
console.log(output); // --> false
base, sample의 길이가 70,000 이상)를 통과해 보세요.const isSubsetOf = function (base, sample) {
base.sort((a, b) => a - b);
sample.sort((a, b) => a - b);
for (let i = 0; i < base.length; i++) {
if (base[i] === sample[0]) {
sample.shift()
}
if (sample.length === 0) return true;
}
return false;
};
const isSubsetOf = function (base, sample) {
// naive solution: O(M * N)
// return sample.every((item) => base.includes(item));
// 각 배열을 정렬: O(N * logN), O(M * logM)
// N >= M 이므로, O(N * logN)
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;
};
N,M?, BigO? 시간 복잡도 개념에 대한 학습이 필요함!