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;
}