scaleform.minarto.com

1. 집합의 뜻과 표시법 본문

ActionScript

1. 집합의 뜻과 표시법

미나토 2009. 5. 20. 21:01


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

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

이녀석들을 몇년만에 보는 것이던가... 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 에서 그러는 것일 수도 있고요... 한글에서 써서 붙였는데... 어찌해야 하나... 혹시 방법을 아시는 분... 이미지로 하기에는 시간이 너무 오래 걸리는데...