isSubsetOf
문제
- 두 개의 배열(
base
,sample
)을 입력받아sample
이base
의 부분집합인지 여부를 리턴한다.
1
2
3
let isSubsetOf = function(base,sample){
}
입력
- base
number
타입을 요소로 갖는 배열base.lenght
는 100 이하
- sample
number
타입을 요소로 갖는 배열sample.length
는 100 이하
출력
boolean
타입을 리턴한다.
주의사항
base
,sample
내에 중복되는 요소는 없다.
입출력 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let base = [1,2,3,4,5]
let sample = [1,3]
let output = isSubsetOf(base, sample);
console.log(output)
// true
sample = [6,7]
let output = isSubsetOf(base, sample);
console.log(output)
// false
base = [10,99,123,7]
sample = [11,100,99,123]
let output = isSubsetOf(base, sample);
console.log(output)
// false
풀이
- 각 배열을 오름차순으로 정렬한다.
- 두 번째
for
문에 각sample[i]
와 배열base
, 처음엔 0번째 인덱스를findItemInSortedArr
함수에 전달한다. - 전달받은 인자로
item
은sample[i]
가 되고arr
는base
,from
은 0이 된다.baseIdx
의 초기값은 0이기 때문이다.
findItemInSortedArr
의for
문을 돌며sample
의 요소와base
의 요소(i
는 전달인자로 넘겨받은sample
의i
번째 인덱스)가 일치하면sample[i]
를 리턴하고, 리턴한sample[i]
는baseIdx
가 된다.base
배열과sample[i]
를 비교하였는데 일치하는 값이 없다면 -1을 리턴한다.
- 만약 일치한다면
baseIdx
는 일치한sample[i]
가 되고, 다시findItemInSoredArr
함수를 돈다. - 넘겨받은 전달인자
from
이sample[i]
이기 때문에i
는 넘겨받은sample[i]
값으로 시작하게 된다. arr=base
이기에base
의sample[i]
번째 인덱스부터 배열의 끝까지 값 중 일치하는 값이 없다면 -1을 리턴한다.- 배열을 전부 돌았을 때,
sample
의 요소 중 하나라도base
의 요소들과 일치하지 않으면 최종baseidx
는 -1값을 갖게 되며 그대로false
를 리턴하게 된다. - 만약 값이 있다면 두 번째
for
문의if
문에 걸리지 않으므로true
를 리턴하게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}
return -1;
}
let baseIdx = 0;
for(let i = 0; i < sample.length; i++){
baseIdx = findItemInSoredArr(sample[i], base, baseIdx);
if(baseIdx === -1) return false
}
return true;
}