- isSubsetOf
두 개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴해야 합니다.
const isSubsetOf = function (base, sample) {
return sample.every((number) => base.includes(number));
}
array 매서드인 every
, inclueds
사용. -> 시간 초과
시간 복잡도를 개선하기 위해 일단 배열을 오름차순으로 정렬했다.
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;
그리고 base의 요소가 sample의 첫 요소와 같다면,
그 첫 요소를 제거하고 남은 요소를 반환한다 (shift()
).
제거하면 이미 확인한 요소는 다시 확인하지 않을 것이므로 시간이 줄어들 것
그리고 이제 sample의 요소의 개수가 하나도 없게 되면, base에 포함된 것들이 제거된 것이므로 부분집합이라고 볼 수 있음 => true
반환
const isSubsetOf = function (base, sample) {
base.sort();
sample.sort();
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;
};
<reference>
1. base와 sample의 요소를 오름차순으로 정렬한다.
2. arr
의 요소와 item
을 from
부터 비교할 함수를 만든다.
const findItemInSortedArr = (item, arr, from) => {}
from
부터 arr
의 길이까지 반복하는 문item
이 arr
의 요소와 같을 경우 현재 인덱스(i
)를 리턴for (let i = from; i < arr.length; i++) {
if (item === arr[i]) return i;
}
item
이 arr
의 요소보다 클 경우 -1을 리턴else if (item < arr[i]) return -1;
인자 from으로 인해 작은수를 비교하지 않아도 된다.
-> 반복이 끝나도 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;
}
이 반복문이 지나도 리턴이 안됐으면 true를 리턴한다 (return true)
레퍼런스코드 보면 이해 안가는게 정말 많앗는데 설명해주셔서 감사합니다👍