[Toy Problem] 03_isSubsetOf

Ditto·2020년 11월 2일

이번 문제는 두개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지의 여부를 리턴하는 문제다. 또한 advanced로 base, sample의 길이가 10,000이상인 경우도 찾아보라고 했는데 일단 이를 생각지 않은채 기본 문제에만 집중하기로 했다.

  • 입출력 예시
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);
console.log(output); // --> false

난 여전히 고차적 생각은 하지 못한채 이중 포문을 써서 문제를 풀었다.

  • 나의 풀이법

const isSubsetOf = function (base, sample) {
  let length = sample.length;
  let count = 0;
  for(let i = 0; i < sample.length; i++){
    for(let j = 0; j < base.length; j++){
      if(sample[i] === base[j]){
        count++;
        continue;
      }
    }
    if(count === length){
      return true;
    }
  }
  return false;
};

문제는 비교적 빨리 풀었으나 또다시 레퍼런스를 본 순간 허탈함이 찾아왔다.


  • 레퍼런스 코드
const isSubsetOf = function (base, sample) {
  return sample.every((item) => base.includes(item));

메소드를 활용하여 내가 만든 수많은 코드들을 단 한줄로 축약했다.
every() method는 배열 안의 모든 요소가 주어진 판별 함수를 통과하는지 테스트한다.
활용하기 쉬운 메소드이므로 반드시 숙지하여야겠다.

  • advanced 레퍼런스 코드
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;
      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;
};
profile
늘 성장하는 개발자이고 싶습니다

0개의 댓글