
- 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)
- ์ด์ base์ ์์๋ฅผ ๋ฐ๋ณตํ๋ฉด์ sample์ ์์๋ฅผ ๊ฐ๊ณ ์์ง ์๋ ๋ฐ๋ณต์ด ์๋ ์๊ฐ --> ๋ฐ๋ณต์ ๋ฉ์ถ๊ณ false๋ฅผ ๋ฐํํ๋ค.
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)
'Algorithm > DailyCoding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[23.02.27] Daily Coding 25 - tiling (0) | 2023.05.19 |
---|---|
[23.02.22] Daily Coding 23 (0) | 2023.05.19 |
[23.02.21] Daily Coding 22 - fibonacci (0) | 2023.05.19 |
[23.02.20] Daily Coding 21 (0) | 2023.05.19 |
[22.11.02] Daily Coding 25 (0) | 2023.05.17 |