Search Results for '집합의 연산'


5 POSTS

  1. 2009/05/27 수학(상) 1. 집합의 연산
  2. 2009/05/26 4. 유한집합의 원소의 개수
  3. 2009/05/22 3. 집합의 연산
  4. 2009/05/22 2. 집합의 포함관계
  5. 2009/05/20 1. 집합의 뜻과 표시법 (1)

수학(상) 1. 집합의 연산

Posted 2009/05/27 19:40 by 미나토



1. 집합의 뜻과 표시법

2. 집합의 포함관계 (부분집합, 진부분집합, 유한집합, 무한집합, 공집합)

3. 집합의 연산 (합집합, 교집합, 전체집합, 여집합, 차집합, 집합의 연산법칙)

4. 유한집합의 원소와 개수


크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3.0, 집합의 연산

4. 유한집합의 원소의 개수

Posted 2009/05/26 17:47 by 미나토


앞서서의 MathSet 클래스를 이용하여 실제 정석 책에 있는 문제를 풀어보도록 하겠다

① 1부터 20까지의 정수 중에서 다음을 구하여라

    1. 3의 배수가 아닌 정수의 개수

   
// 1부터 20까지의 정수를 포함하는 전체집합
var U:Array = [];
var i:uint = 1;
while(i <= 20)
{
    U[i - 1] = i;
    i ++;
}

// 전체집합 중 3의 배수
var A:Array = [];
var cnt:uint = U.length;
i = 1;
while(i <= 20)
{
    var n:Number = U[i];
    if(n % 3 == 0)    A.push(n);
    i ++;
}

trace(MathSet.differenceMathSet(U, A).length)

//////////////////////

14

집합의 연산에서 배운 차집합을 이용한 계산이다...

U - A 라는 뜻이다

실제로 구하려면 굳이 차집합 메소드를 이용하지는 않겠지만 지금은 앞서 작성한 코드가 제대로 동작하는 지를 보는 것이니...


이번에는 여기까지다...


벌써 귀찮아진건 아니고 책을 보니 이번 챕터는 다 연습문제를 푸는 것이라...별로 할게 없다... 책을 구하셔서 직접들 앞서의 클래스를 이용하여 풀어보는 수밖에...


그럼 이상으로 집합의 연산 단원을 마치고 다음 단원인 명제와 조건으로 넘어가도록 하겠다...







크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3.0, 유한집합의 원소의 개수, 집합의 연산

3. 집합의 연산

Posted 2009/05/22 14:01 by 미나토




① 합집합

두개의 집합을 모두 포함한 집합

array ∪ array2 = {o | o ∈ array or o ∈ array2}




② 교집합

두개의 집합에서 같이 포함한 원소만을 모아놓은 집합

array ∩ array2 = {o | o ∈ array and o ∈ array2}




③ 전체집합

모든 집합이 부분집합인 집합

U



④ 여집합

집합 array 에는 속하지만 전체집합 U 에는 속하지 않는 집합을 array 의 여집합이라고 한다

arrayc= {o | o ∈ U and o ∉ array}


      
⑤ 차집합

집합 A 와 B 가 있을 때 A 에서 B 와의 교집합을 뺀 집합

array - array2 = {o | o ∈ array and o ∉ array2}



기존 클래스에 위의 연산메소드를 포함시켰다

package com.minarto.math
{
    public class MathSet
    {
        /**
         * 배열의 중복 원소를 제거
         */
        public static function convertMathSet(a:Array):Array
        {
            if(!a)    return    null;
           
            var mathSet:Array = [];
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = a[i];
                if(a.indexOf(n, i + 1) == - 1)    mathSet.push(n);
                i++;
            }
           
            return    mathSet;
        }       
       
       
        /**
         * 부분집합
         * a 가 b 의 부분집합인지 판단
         */
        public static function isSubSet(a:Array, b:Array):Boolean
        {
            var same:Boolean = true;
              
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = a[i];
                if(b.indexOf(n) == - 1)
                {
                    same = false;
                    break;
                }
                i++;
            }
              
            return same;
        }
       
       
        /**
         * 상등
         * 두 집합이 같은지를 판단
         */
        public static function isEqualsSet(a:Array, b:Array):Boolean    {    return    isSubSet(a, b) && isSubSet(b, a);    }
       
       
        /**
         * 진부분집합
         */
        public static function isProperSubSet(a:Array, b:Array):Boolean    {    return    isSubSet(a, b) && !isEqualsSet(a, b);    }
       
       
        /**
         * 합집합
         */
        public static function sumOfSets(a:Array, b:Array):Array    {    return    convertMathSet(a.concat(b));    }
       
       
        /**
         * 여집합
         * @param a:Array - 여집합을 구할 집합
         * @param u:Array - 전체집합
         */
        public static function complementaryMathSet(a:Array, u:Array):Array
        {
            var mathSet:Array = [];
            var cnt:uint = u.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = u[i];
                if(a.indexOf(n) == - 1)    mathSet.push(n);
                i++;
            }
           
            return    mathSet;
        }
       
       
        /**
         * 차집합
         * a - b
         * @param a:Array - 차집합을 구할 집합
         * @param b:Array - 뺄 집합
         */
        public static function differenceMathSet(a:Array, b:Array):Array
        {
            var mathSet:Array = [];
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = a[i];
                if(b.indexOf(n) == - 1)    mathSet.push(n);
                i++;
            }
           
            return    mathSet;
        }
    }
}


⑥ 집합의 연산법칙

다음은 정석 책에 있는 연산법칙을 그대로 옮긴 것이다. 이것은 위의 클래스를 활용하여 직접 확인해 보는 수밖에 없다

교환법칙 : A∪B = B∪A, A∩B = B∩A
결합법칙 : (A∪B)∪C = A∪(B∪C), (A∩B)∩C = A∩(B∩C)
분배법칙 : A∪(B∩C) = (A∪B)∩(A∪C), A∩(B∪C) = (A∩B)∪(A∩C)
흡수법칙 : A∪(A∩B) = A, A∩(A∪B) = A
드모르간의 법칙 : (A∪B)c = Ac∩Bc,  (A∩B)c = Ac∪Bc
크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3.0, 집합의 연산

2. 집합의 포함관계

Posted 2009/05/22 11:40 by 미나토



부분집합

1번 강좌에서 원소가 집합에 포함되었는지를 다음과 같이 표현한다고 했다

n ∈ array, n ∉ array

n ∈ array 이면 n ∉ array2 일때 array 를 array2 의 부분집합 이라 한다.
집합 array 원소가 집합 array2 에도 포함되어 있다는 것을 표현하는 것이다.

array ⊂ array2, array2 ⊃ array



상등 (array2 는 array 를 포함하고 array 는 array2 를 포함한다) 은 다음과 같이 표현한다.
array ⊂ array2 이고 array ⊃ array2 면 array = array2



② 진부분집합

array ⊂ array2 이고 array ≠ array2


③ 유한집합

array = {-2, 1, 2, 3} 와 같이 원소갯수가 유한한 집합

var array:Vector = new Vector.<Number>();
array[0] = -2;
array[1] = 1;
array[2] = 2;
array[3] = 3;


④ 무한집합

array = {n | n은 정수} 와 같이 원소갯수가 무한한 집합

var array:Vector = new Vector.<Number>();
var n:Number = - Infinity;
var count = Infinity;
while(n < count)
{
    array.push(int(n));
    n ++;
}

단, 위의 코드는 실제 실행시키면 무한루프에 빠져 플래시가 다운될 것이다. 원리만 설명하는 것이니 우를 범하지 말자



⑤ 공집합

array = {}, ∅ 원소가 하나도 없는 집합

var array:Vector.<Number> = new Vector.<Number>();
or
array.length = 0;
or
var array:Vector.<Number> = new Vector.<Number>(0, true);








위의 의미들을 이용하여 다음과 같은 클래스가 만들어졌다



package com.minarto.math
{
    public class MathSet
    {
        /**
         * 배열의 중복 원소를 제거
         */
        public static function convertMathSet(a:Array):Array
        {
            if(!a)    return    null;
           
            var mathSet:Array = [];
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = a[i];
                if(a.indexOf(n, i + 1) == - 1)    mathSet.push(n);
                i++;
            }
           
            return    mathSet;
        }       
       
       
        /**
         * 부분집합
         * a 가 b 의 부분집합인지 판단
         */
        public static function isSubSet(a:Array, b:Array):Boolean
        {
            var same:Boolean = true;
              
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var n:Number = a[i];
                if(b.indexOf(n) == - 1)
                {
                    same = false;
                    break;
                }
                i++;
            }
              
            return same;
        }
       
       
        /**
         * 상등
         * 두 집합이 같은지를 판단
         */
        public static function isEqualsSet(a:Array, b:Array):Boolean    {    return    isSubSet(a, b) && isSubSet(b, a);    }
       
       
        /**
         * 진부분집합
         */
        public static function isProperSubSet(a:Array, b:Array):Boolean    {    return    isSubSet(a, b) && !isEqualsSet(a, b);    }
       
       
        /**
         * 합집합
         */
        public static function sumOfSets(a:Array, b:Array):Array    {    return    convertMathSet(a.concat(b));    }
    }
}

크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3.0, 집합의 연산, 집합의 포함관계

1. 집합의 뜻과 표시법

Posted 2009/05/20 21:01 by 미나토


갑자기 뭔가를 공부하고 싶을 때가 있다... 저녁에 학원을 갔다가 돌아오는 길에 정석이나 다시 펴볼까? 라는 생각이 들었다.

요컨데 충동적으로 정석을 플래시로 옮겨보자...라는 생각이 들어 아침에 출근하자마자 공원몰에서 정석책을 질렀다.

이녀석들을 몇년만에 보는 것이던가... 20여년 만인가?


말했다시피 순전히 충동적이다... 몇번 하다가 관둘지도 모른다... 업데이트 주기도 모르겠다...


아무튼 정석책을 플래시로 옮기는 위대한(?) 시작의 첫 페이지라고만 봐달라... 바로 마지막 페이지가 될지도... :)


글을 보기에 앞서

다음의 점선 연두색 상자는 수학적 표현을 뜻한다
 

다음은 플래시로의 표현을 뜻한다
 


자...그럼...



① 집합을 플래시로 표현한다면...

집합이란 어떠한 원소들이 모여있는 객체이다.

플래시에서 집합은 무엇을 의미하는 것일까?

다음의 상자를 set 이란 집합이라고 보자


set 집합
0    c    d
a    2    5
b    ㄱ   ㅓ


간단히 생각해보면 Array 라고 생각할 수 있을 것이다.

하지만 Array 와 달리 인덱스(순서)의 개념이 없다. 순서의 개념이 없이 그냥 속해있을 뿐이다.
이런 면에 있어서는 오히려 Object 에 가깝다고 할 수 있다.

물론 Array 도 dynamic 클래스 이기 때문에 hash 구조도 지원한다...하지만 집합은 인덱스 개념이 없으니 Object 에 가깝다고 하는 것이다.

실제로 수학책에서의 집합 표기도 플래시의 Object 객체 생성문법인 {} 이다. 위의 집합을 원소나열법으로 표시하면 다음과 같다.
set = {0, c, d, a, 2, 5, b, ㄱ, ㅓ}
c가 두번째에 표현되어 있다고 해서 1번 인덱스에 있는 것이 아니라는 것이다.
플래시로 표현하자면
trace(set[1]) -- > null
trace(set[c]) -- > c

의 결과값이 나온다는 것이다

지금까지의 결과대로 코드를 짜보자

package com.minarto.math
{
    public dynamic class MathSet
    {
        public static function convertMathSet(a:*):MathSet
        {
            if(!a)    return    null;
           
            var sets:MathSet = new MathSet();
            var cnt:uint = a.length;
            var i:uint;
            while(i < cnt)
            {
                var o:Object = a[i];
                if(a.indexOf(o, i + 1) == - 1)    sets[o] = o;
                i++;
            }
           
            return    sets;
        }
    }
}

/////////

import com.minarto.math.MathSet;

var array:Array = [1, 2, 3, 4, 2, 1, "r"];
var sets:MathSet= MathSet.convertMathSet(array);

trace(sets["r"]) -- > r
trace(sets[2]) -- > 2

어떠한 원소이건 붙어야 하니 dynamic 클래스로 만들었고 배열에서 중복된 원소를 제거하여(수학에서 중복된 원소를 잘 사용하지 않기 때문에) hash 스타일로 원소에 접근할 수 있도록 변환해주는 메소드를 첨가했다



하지만 데이터의 모음이라는 집합의 활용 목적을 생각해보면 그래도 Array 에 가깝다고 해야 할 것이다.
앞의 코드가 이론이라면 이제부터가 활용할 수 있는 실제라고 치자


자, 그렇다면 집합을 Array 라고 보고 집합의 각종요소들을 플래시로 풀어보자

package com.minarto.math
{
 public class MathSet
 {
  public static function convertMathSet(a:Array):Number
  {
   if(!a) return null;
   
   var sets:Array = [];
   var cnt:uint = a.length;
   var i:uint;
   while(i < cnt)
   {
    var n:Number = a[i];
    if(a.indexOf(n, i + 1) == - 1) sets.push(n);
    i++;
   }
   
   return sets;
  }
 }
}

앞서 말한대로 MathSet 은 더 이상 객체가 될 필요가 없으니 dynamic 을 삭제하고 집합에서 사용할 메소드를 추가할 수 있도록 클래스만 작성해놓았다.


Array 으로 작성해 놓았기 때문에 다음과 같은 기능을 추가하기 쉽다.


n 라는 원소가 array 라는 집합에 포함되는 지에 대한 여부
포함되었을 때 : n ∈ array
포함되지 않았을 때 : n ∉ array

public static function inSet(n:Number, sets:Array):Boolean
{
    return sets ? sets.indexOf(n) > -1 : false;
}

//////////////////////

var array:Array = [0, 1, 2, 3, 4, 5];

trace(MathSet.inSet(2, array)) -- > true
trace(MathSet.inSet(22, array)) -- > false




② 집합의 표시법


집합의 표시법은 원소나열법과 조건제시법이 있다

원소나열법은 다음과 같이 간단히 표현할 수 있다.

원소나열법
array = {0, c, d, a, 2, 5, b, ㄱ, ㅓ}

var array:Array = [0, c, d, a, 2, 5, b, ㄱ, ㅓ];


이제 문제는 조건제시법이다

array = {o | ∱(o)}

∱(o) 에 조건을 명시하여 표기하는 방법인데 (예 : array = {o|o는 정수} = {-n,...,-2, -1, 0, 1, 2,..n}) 딱히 방법이 안떠오를 것이다.

이럴 때는 Vector 의 데이터 형을 이용하자

var array:Vector.<int> = new Vector.<int>();

물론 이걸로 끝은 아니다. 조건 제시법은 실제로 데이터(원소)가 있는 것이고 Vector 는 조건만을 제시해 놓은 것이기 때문이다. 실제로는 반복문을 돌리던지 해서 원소를 넣어야 두가지가 같아지는 것이라고 할 수 있다.

하지만 지금은 원리를 설명하는 것이니 그런것은 넘어가도록 하자... :)




자, 글이 길어졌으니 오늘은 여기까지...





p.s. 코드 참 볼 것 없죠? 기본 문법이나 적고 있으니...고수님들은 한숨이 나올 지도 모르겠습니다.

하지만 이 글의 목적은 정석을 플래시로 표현하자이지... Cool Code 를 제공하자가 아닙니다...

x 좌표값을 구할 때 Math.cos(a * Math.PI / 180) * r 이란 것을 왜 이렇게 작성하는지 모르고 그냥 외워서 쓰고 있는 분들을 위한 글입니다.
그러고 보니 원주율에 대한 부분까지 가려면 몇개월은 더 써야겠군요...ㅡ.,ㅡ;;;


p.s.. 수학기호들이 일부 브라우저에서 깨지는 거 같네요...일부 OS 에서 그러는 것일 수도 있고요... 한글에서 써서 붙였는데... 어찌해야 하나... 혹시 방법을 아시는 분... 이미지로 하기에는 시간이 너무 오래 걸리는데...

크리에이티브 커먼즈 라이선스
Creative Commons License

Tag : as3.0, 집합의 뜻과 표시법, 집합의 연산