JavaScript에서 두 배열을 비교하는 방법

임경섭·2023년 4월 19일
0

Code States에서 진행하는 Daily Coding 24번을 풀다가 발견한 사실이 있다.

문제

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

const isSubsetOf=function(base,sample){
	// ToDo:아래에 코드를 작성하시오.
}

처음에는 두 배열을 오름차순으로 정렬한 뒤, filter를 통해 요소를 비교하여 두 배열이 같은지 확인한다. 같으면 true, 다르면 false를 반환하려 했다.

const isSubsetOf = function (base, sample) {
  // TODO: 여기에 코드를 작성합니다.
  // 우선 두 배열을 정렬한다.
  base.sort(function(a, b)  {
    return a - b;
  });
  sample.sort(function(a,b){
    return a - b;
  })
  // base와 sample이 같은 요소가 존재하면, 그 요소를 result에 담아준다.
  // 없는 경우 중복되는 요소가 없으므로, 계속 return하다가 끝난다.
  // 최종 result와 sample의 크기를 비교한다.
  let i=0;
  const result=base.filter(number=>{
    if(number===sample[i]){
      i++;
      return number;
    }else return;
  })

  return result===sample;
};

배열 resultsample은 동일한 요소를, 동일한 순서대로 가지고 있지만, false를 반환하는 것이였다.

기존 문법에서 기초적인 사실을 까먹고 있었다.
JavaScript에서는 두 개의 배열이 동일한 요소를, 동일한 순서대로 가지고 있어도 다른 배열로 인식한다. 이유는 배열과 객체는 값을 비교하지 않고, 그 주소를 비교하기 때문이다.

이러한 이유로 원하는 답이 나오지 않았고, 다른 방법을 찾기 시작했다.

JSON.stringfy()

JSON.stringify() 메서드는 JavaScript 값이나 객체를 JSON 문자열로 변환한다.
따라서 배열을 비교할 때, 요소 하나씩 다 비교할 필요가 없다.

최종 답안

const isSubsetOf = function (base, sample) {
  // TODO: 여기에 코드를 작성합니다.
  // 우선 두 배열을 정렬한다.
  base.sort(function(a, b)  {
    return a - b;
  });
  sample.sort(function(a,b){
    return a - b;
  })
  // base와 sample이 같은 요소가 존재하면, 그 요소를 result에 담아준다.
  // 없는 경우 중복되는 요소가 없으므로, 계속 return하다가 끝난다.
  // 최종 result와 sample의 크기를 비교한다.
  let i=0;
  const result=base.filter(number=>{
    if(number===sample[i]){
      i++;
      return number;
    }else return;
  })

  return JSON.stringify(result)===JSON.stringify(sample);
};
profile
즐겁게 코딩 ૮₍ •̀ᴥ•́ ₎ა

0개의 댓글