Toy3 부분집합

woobaeh·2022년 3월 5일
0

Algorithm

목록 보기
5/7

문제

두 개의 배열(base, sample)을 입력받아 samplebase의 부분집합인지 여부를 리턴해야 합니다.

입력

인자 1 : base

  • number 타입을 요소로 갖는 임의의 배열
  • base.length는 100 이하

인자 2 : sample

  • 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

Advanced

  • 시간 복잡도를 개선하여, Advanced 테스트 케이스(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? 시간 복잡도 개념에 대한 학습이 필요함!
profile
상생을 통하여 파이를 훨씬 크게 키울 수 있다. WIN - WIN

0개의 댓글