GameMaker강좌[GMS2]/GMS2기초강좌

[게임메이커 강좌-기초][GMS2] 두 배열 그룹의 교집합과 합집합

타락카얀 2024. 1. 3. 10:27
728x90

 

 

GAME MAKER 강좌

 

KAYAN

 

 

 

 

 

 

두 배열 그룹의 교집합 값과 합집합 값을 구하는 방법에 대해 알아봅시다.

 

 

◈ 두 배열 그룹의 교집합

 

(▲ 교집합)

 

두 배열 그룹(또는 여러 그룹)의 교집합 값은 아래 함수를 사용하면 쉽게 새 배열 그룹으로 구성할 수 있습니다.


   array_intersection(array1, array2 [, array3, ... array_n])

이 함수는 지정한 배열 그룹들 간에 일치하는 값들로 새로운 배열 그룹으로 반환합니다.

그리고 중복 값은 1개의 고유 값만 남깁니다.

 

예를 들어, 아래와 같은 배열 그룹의 교집합을 구한다면,


   array1=["사과","오렌지","배","포도","파인애플","복숭아"]
   array2=["사과","바나나","수박","포도","파인애플","딸기"]
   
   my_array=array_intersection(array1, array2);


my_array 배열은 아래와 같이 ["사과", "포도", "파인애플"]값으로 구성됩니다.


   my_array[0]="사과";
   my_array[1]="포도";
   my_array[2]="파인애플";


 

 

 

 

 

◈ 두 배열 그룹의 중복값을 포함한 합집합

 

(▲ 합집합)

 

두 배열 그룹(또는 여러 그룹)의 합집합값은 아래 함수를 사용하면 쉽게 새 배열 그룹으로 구성할 수 있습니다.


   ● array_concat(array1, array2 [, array3, ... array_n])

이 함수는 배열 순서대로 모든 값을 결합한 새 배열을 반환합니다.

배열과 배열을 하나로 결합하는 것이기 때문에 중복값이 있더라도 같이 포함됩니다.

 

예를 들어, 아래와 같은 배열 그룹의 합집합을 구한다면,


   array1=[1, 3, 15, 21];
   array2=[2, 6, 15, 18, 21, 35];
   
   my_array=array_concat(array1, array2);


my_array 배열은 [1, 3, 15, 21, 2, 6, 15, 18, 21, 35]값으로 구성됩니다.

 

 

 

 

◈ 두 배열 그룹의 중복값을 제거한 합집합

 

(▲ 합집합)

 

두 배열 그룹(또는 여러 그룹)의 합집합값은 아래 함수를 사용하면 쉽게 새 배열 그룹으로 구성할 수 있습니다.


   ● array_union(array1, array2 [, array3, ... array_n])

이 함수는 배열의 중복된 값은 1개의 고유값만 남기고, 모든 값을 결합한 새 배열을 반환합니다.

 

예를 들어, 아래와 같은 배열 그룹의 합집합을 구한다면,


   array1=[1, 3, 15, 21];
   array2=[2, 6, 15, 18, 21, 35];
   
   my_array=array_union(array1, array2);


my_array 배열은 [1, 3, 15, 21, 2, 6, 18, 35]값으로 구성됩니다.

 

 

 

 

 

◈ 배열에서 중복값 제거

 

 

배열 내에서 중복값을 제거할 때는 아래 함수를 사용하면 쉽게 제거할 수 있습니다.


   ● array_unique(array, [offset], [length])

이 함수는 지정한 배열(array)의 중복된 값은 1개의 고유한 값만으로 새 배열을 반환합니다.

 

※ [참고] : [offset] 과 [length] 는 옵션 설정으로 지정 범위내에서만 부분적 배열 구성이 필요할 때 설정합니다.

 

   [offset] 은 배열내 적용 범위의 시작 위치를 지정합니다.

   양수로 지정하면 정방향, 음수로 지정하면 역방향의 범위를 지정할 수 있습니다.

   예를 들어, -1을 지정하면 배열의 맨 끝부터, -2를 지정하면 끝에서 두번째부터 범위를 적용할 수 있습니다.

   참고로 배열의 첫번째 인덱스는 0번입니다.

 

   [length] 는 적용 범위의 길이를 지정합니다.

   양수로 지정하면 정방향, 음수로 지정하면 역방향의 범위를 지정할 수 있습니다.

 

예)


   array1=[2, 6, 15, 6, 21, 18, 35, 15];


   my_array=array_unique(array1);


위의 코드에서 중복값 [6, 15] 을 각각 1개씩만 남기면, [2, 6, 15, 21, 18, 35]가 됩니다.

 

 

 

 

 

◈ 차집합

 

(▲ 차집합)

 

먼저 array_intersection 함수를 사용하여 두 배열의 교집합을 구합니다.

그리고 array_filter 함수를 사용하여 차집합으로 구하고자 하는 배열을 지정하고 교집합의 배열을 제거하면 됩니다.


   array_filter(array, function, [offset], [length])

array_filter 함수는 지정한 배열(array)을 콜백 메서드로 필터링에 유효한 값으로 새 배열을 반환합니다.

예를 들어, 아래와 같은 콜백 메서드를 필터링에 사용한다면,

 

예)


    function passed_the_test(element, index)
    {
    return element >= 50; // 반환값이 참(true)이면 배열에 값을 추가, 거짓(false)이면 걸러냄.
    }


    scores = [0, 15, 4, 78, 96, 65, 49];
    passed = array_filter(scores, passed_the_test);


지정한 배열을 순환하면서 배열 인덱스의 값이 콜백 메서드 passed_the_test에 유효한 값일 때, 새 배열 passed에 추가하게 됩니다.

 

위 내용을 차집합을 구하는데 응용하면 아래와 같습니다.

먼저 array1 과 array2의 교집합을 구하고, 이것을 필터링할 콜백 메서드 passed_the_test에 사용합니다.

그리고 array_filter 함수로 차집합을 구할 배열을 순환하면서 유효한 값으로 새 배열을 만듭니다.


    //array 1의 차집합을 구할 때,


    array1=[1, 3, 15, 21];
    array2=[2, 6, 15, 18, 21, 35];


    _target=array_intersection(array1, array2);//두배열의 교집합

    var passed_the_test = function(_val, _index) //차집합에 적용할 함수
        {
        var i,n,_return;
        _return=1;
    
        if is_array(_target){
        if array_length(_target)>0{
        n=array_length(_target);
        for(i=0;i<n;i++;){
        if (_target[i]==_val){_return=0;break;}//교집합 값은 포함하지 않음(false)
        }
        }
        }
        return _return;
        }

    passed = array_filter(array1, passed_the_test);
   //차집합으로 구하고자 하는 배열을 지정하고 교집합의 배열을 제거함




위의 코드에서 array1의 차집합은 교집합 [15, 21]을 제외하면, array1에서 [1, 3]가 남습니다.

 

 

 

 

◈ 대칭차

 

(▲ 대칭차)

 

대칭차는 차집합을 응용하면 됩니다.

먼저 array_concat 함수를 사용하여 두 배열의 합집합을 구합니다.

그리고 array_intersection 함수를 사용하여 두 배열의 교집합을 구합니다.

다음 array_filter 함수를 사용하여 합집합으로 구한 배열을 지정하고 교집합의 배열을 필터링하면 됩니다.

 


     scores1=[1, 3, 15, 21];
     scores2=[2, 6, 15, 18, 21, 35];


    // 배열 score1 과 배열 score2 의 차집합 구하기

    _all_array=array_concat(scores1, scores2);//두배열의 중복값을 포함한 합집합. 중복값 제거는 array_union함수 사용

    _target=array_intersection(scores1, scores2);//두배열의 교집합


    //배열 함수에 사용할 콜백 메서드
     var passed_the_test = function(_val, _index) //차집합에 적용할 함수

        {
        var _return=1;
        if is_array(_target){
        if array_length(_target)>0{
        _return = !(array_contains(_target,_val));//교집합값은 제외
        }
        }
        return _return;
        }


   //합집합 배열을 지정하고 교집합의 배열을 제거함
    passed = array_filter(_all_array, passed_the_test);


위의 코드에서 대칭차는 교집합 [15, 21]을 제외하면, scores1에서 [1, 3], scores2에서는 [2, 6, 18, 35]가 남습니다.

 

 

 

 

 

 

 

 

 

300x250