집합

gicomong·2020년 11월 28일
0

자료구조

목록 보기
5/6

5. 집합

1) 집합이란?

: 정렬되지 않은 컬렉션이다.

: 중복된 원소를 포함하지 않는다.

: 집합은 합집밥, 교집합, 차집합 같은 수학적 연산도 가능하다.


2) 집합 만들기

  • set클래스의 기본 뼈대는 아래와 같다.
function Set(){
  var items = {};
}

(1) 집합 구현시 필수 메소드

  • add(원소) : 원소를 추가한다.

  • remove(원소) : 원소를 삭제한다.

  • has(원소) : 어떤 원소가 집합에 포함되어 있는지 여부를 true, false로 반환한다.

  • clear() : 모든 원소를 삭제한다.

  • size() : 원소 개수를 반환한다. 배열의 length와 비슷하다.

  • values() : 집합의 모든 원소를 배열형태로 반환한다.


(2) has(원소)

  • 집합의 모든 원소는 객체에 담겨 있으므로 in 연산자로 해당 원소가 items에 있는지 확인한다.
//방법1
this.has = function(value){
  return value in items;
}

//방법2
this.has = function(value){
  retrun items.hasOwnProperty(value);
}

(3) add()

  • 집합에 새 원소를 추가하는 메소드이다.
this.add = function(value){
  if(!this.has(value)){
    items[value] = value;    //키,값 동일하게 저장
    return true;
  }
  return false;
}

(4) remove, clear()

  • remove()는 삭제할 원소가 집합에 존재하는지 확인하고, 해당 원소가 있다면 삭제한다.
this.remove = function(value){
  if(this.has(value)){
    delete items[value];   //delete연산자 사용
    return true;
  }
  return false;
}
  • 집합의 모든 원소를 삭제하고 싶다면 clear()를 사용한다.
this.clear = function(){
  items {};
}

(5) size()

  • Object에는 key라는 메소드가 있는데, 객체의 모든 property를 배열로 반환한다.

  • 따라서, 이 배열의 length로 원소개수를 파악할 수 있다.

this.size = function()}{
  return Object.keys(items).length;
}

(6) values()

  • Object에는 key라는 메소드를 사용해 value값을 반환한다.
this.values = function(){
  return Object.keys(items);
}

2) 집합 연산

(1) union(), 합집합

이미지 클릭시 이미지 출처로 이동합니다.

  • 합집합은 두 집합 중 어느 한 쪽이라도 포함된 원소로 구성된 집합이다.
this.union = function(otherSet){
  var unionSet = new Set();       //합집합 생성
  
  var values = this.values();     //첫번째집합의 모든 value를 추출
  for(var i=0; i<values.length; i++){  //합집합에 value를 추가
    unionSet.add(values[i]);
  }
  
  values = otherSet.value();      //두번째집합의 모든 value를 추출
  for(var i=0; i<values.length; i++){  //합집합에 value를 추가
    unionSet.add(values[i]);
  }
  return unionSet;
};

(2) intersection(), 교집합

이미지 클릭시 이미지 출처로 이동합니다.

  • 교집합은 두 집합 모두 포함되어 있는 원소로 구성된 집합이다.
this.intersection = function(otherSet){
  var intersectionSet = new Set();    //교집합 생성
  
  var values = this.value();          //첫번째 집합의 모든 value추출
  for(var i=0; i<values.length; i++){
    if(otherSet.has(values[i])){       //다른집합에 같은 값이 있다면?
      intersectionSet.add(values[i]);  //교집합에 해당 값 추가
    }
  }
  return intersectionSet;
}

(3) difference(), 차집합

이미지 클릭시 이미지 출처로 이동합니다.

  • 차집합은 첫번째 집합에는 있지만 두번째 집합에는 없는 원소로 구성된 집합이다.
this.difference = function(otherSet){
  var differentSet = new Set();     //차집합 생성
  
  var values = this.values();       //첫번째 집합의 값 추출
  for(var i=0; i<values.length; i++){
    if(!otherSet.has(values[i])){   //두번째 집합에 해당 값이 없다면
      differentSet.add(values[i]);  //차집합에 추가
    }
  }
  return differenceSet;
}

(3) subset(), 부분집합

이미지 클릭시 이미지 출처로 이동합니다.

  • 부분집합은 어떤집합이 다른 집합의 일부인지 확인한다.
this.subset = function(otherSet){
  //두 집합의 크기를 비교
  //만약 this가 otherSet보다 원소가 맞다면, 이미 부분집합 조건이 아님
  if(this.size() > otherSet.size()){
    return false;
  }
  else{
    var values = this.values();         //this의 values 추출
    for(var i=0; i<values.length; i++){
      if(!otherSet.has(values[i])){     //otherSet이 this의 값이 없다면 false
        return false;
      }
    }
    return true;
  }
}
profile
이전에 본 포스팅이 없다구요? 티스토리로 이사갔어요! (새 글은 이제 티스토리에서 개재합니다~)

0개의 댓글