1. 너비우선탐색

   - 큐를 이용하여 깊이가 같은 노드를 모두 방문하고 깊이를 증가시키며 탐색하는 알고리즘이다.


2. 동작원리

   1) 지정한 시작 노드에서부터 시작

   2) 자식 노드들을 큐에 저장한다

   3) 큐에 저장된 노드를 차례로 방문하면서 방문한 노드의 자식들을 큐에 저장

   4) 큐에 있는 요소를 방문하면서 2) 3)의 과정을 반복

   5) 모든 노드를 방문하면 탐색을 종료


   



3. 소스

  1. #include<stdio.h>
  2.  
  3.  
  4. int front = -1;
  5. int rear;
  6.  
  7. void inqueue(int *,int);  // 큐에 데이터를 삽입하는 연산
  8. int dequeue(int *);  // 큐에서 데이터를 빼는 연산
  9. int queueempty()// 큐가 비어있는지 검사
  10.  
  11. int matrix[6][6] = {{0,1,1,0,0,0},
  12.                     {1,0,1,1,0,0},
  13.                     {1,1,0,1,1,0},
  14.                     {0,1,1,0,1,1},
  15.                     {0,0,1,1,0,0},
  16.                     {0,0,0,1,0,0}};
  17. int visit[6];
  18.  
  19.  
  20. int main(void)
  21. {
  22.     int a=0;
  23.     int b=0;
  24.     int now = 0;
  25.  
  26.     int queue[40] = {0,};
  27.  
  28.     visit[0] = 1// 처음방문할 정점
  29.  
  30.     inqueue(queue,0);
  31.     printf("%d ",now);
  32.  
  33.  
  34.     while(queueempty())
  35.     {
  36.         now = dequeue(queue)// 큐의 원소를 빼내 인접 노드를 찾는다
  37.  
  38.         if(visit[now] == 0)  // 인접노드중 방문하지 않은 노드를 찾기위해 vist배열을 검사
  39.         {
  40.             printf("%d ",now);
  41.             visit[now] = 1;
  42.         }
  43.  
  44.         for(a=0;a<6;a++) // 현재 노드의 인접 노드를 큐에 저장하기 위한 for문
  45.         {
  46.             if(matrix[now][a] == 1 && visit[a] == 0)
  47.                     inqueue(queue,a);
  48.         }
  49.        
  50.     }
  51.     return 0;
  52. }
  53.  
  54. int queueempty()
  55. {
  56.     if(front == rear)
  57.         return 0;
  58.     else
  59.         return 1;
  60. }
  61.  
  62. void inqueue(int *queue, int data)
  63. {
  64.     if(rear == 40)
  65.         printf("큐가 꽉찾습니다.\n");
  66.     else
  67.         (*(queue + (rear++))) = data;
  68. }
  69.  
  70. int dequeue(int * queue)
  71. {
  72.     int data;
  73.  
  74.         data = (*(queue+(++front)));   
  75.         return data;
  76.    
  77.  
  78. }



4. 결과

   

1. 대푯값과 평균 

   - 대푯값 : 자료 전체의 특징을 하나의 수로 나타낸 값

   - 평균 : 변량의 총합을 변량의 개수로 나눈 값,  (평균) = (변량의 총합) / (변량의 개수)


2. 중앙값과 최빈값
   1) 중앙값 : 변량을 작은 값부터 크기순으로 나열했을 때, 중앙에 위치하는 값
      - 자료의 개수가 홀수이면 중앙에 놓이는 값이 중앙값이다
      - 자료의 개수가 짝수이면 중앙에 놓이는 두 자료의 평균이 중앙값이다
   2) 최빈값 : 변량 중에서 가장 많이 나타나는 값, 즉 도수가 가장 큰 값
      - 자료의 값 중에서 도수가 가장 큰 값이 한 개 이상 있으면 그 값이 모두 최빈값이다
      - 각 자료의 값으 도수가 모두 같으면 최빈값은 없다
   3) 도수분포표에서의 중앙값과 최빈값
      - 도수분포표에서의 중앙값은 중앙에 위치한 자료의 값이 속하는 계급의 계급값이다
      - 도수분포표에서의 최빈값은 도수가 가장 큰 계급의 계급값이다

3. 산포도와 편차
   1) 산포도 : 자료 전체가 대푯값을 중심으로 흩어져 있는 정도를 하나의 수로 나타낸 값
   2) 편차 : 자료의 한 변량에서 평균을 뺀 값, 즉 (편차) = (변량) - (평균)
       - 편차의 합은 항상 0 이다
       - 평균보다 큰 변량의 편차는 양수이고, 평균보다 작은 변량의 편차는 음수이다

4. 분산과 표준편차 
   1) 분산 : 각 변량의 편차의 제곱의 합을 전체 변량의 개수로 나눈 값, 즉 편차의 제곱의 평균
             (분산) = (편차)²의 총합 / (변량)의 개수
   2) 표준편차 : 분산의 양의 제곱근, 즉 (표준편차) = √(분산)

5. 도수분포표에서의 평균, 분산, 표준편차
   1) 평균 = (계급값) * (도수) 의 총합 / (도수)의 총합
   2) 분산 = (편차)² * (도수) 의 총합 / (도수)의 총합
   3) 표준편차 = √(분산)

6. 변량의 변화에 따른 평균과 분산, 표준편차의 변화
   n개의 변량 x, x1, x2, x3, x3 ... ,xn의 평균이 m이고 표준편차가 s일 때, 새로운 변량
   ax1+b, ax2+b, ax3+b, ... , axn+b 의 평균과 표준편차는
   1) (평균) = am + b       2) 표준편차 = |a|s

7. 자료의 분석
   두 개 이상의 집단의 자료를 비교할 때, 평균과 표준편차는 각각 다음과 같은 의미로 사용된다
   1) 집단들의 우열을 비교할 때 평균을 사용한다
   2) 부난 또는 표준편차가 작다
       - 변량이 평균 가까이에 분포되어 있다
       - 자료의 분포 상태가 고르다
   3) 분산 또는 표준편차가 크다
       - 변량이 평균에서 멀리 떨어져 있다
       - 자료의 분포 상태가 고르지 않다


'수학' 카테고리의 다른 글

경우의 수와 확률  (0) 2016.11.07
도수분포와 그래프  (0) 2016.11.02
이차함수  (0) 2016.11.01
일차함수  (0) 2016.11.01
함수  (0) 2016.11.01

1. 사건과 경우의 수

   - 사건 : 실험이나 관찰에 의하여 일어나는 결과

   - 경우의 수 : 어떤 사건이 일어날 수 있는 모든 가짓수


2. 사건 a 또는 사건 b가 일어나는 경우의 수(합의법칙)

   - 두 사건 a, b가 동시에 일어나지 않을 때, 한 사건 a가 일어나는 경우의 수가 m가지이고, 다른 사건 b가 일어나는 경우의 수      가 n가지 이면 (사건 a또는 사건 b가 일어나는 경우의 수) = m + n (가지)


3. 사건 a또는 사건 b가 동시에 일어나는 경우의 수 (곱의 법칙)

   - 한사건 a가 일어나는 경우의 수가 m가지이고, 그 각각에 대하여 다른 사건 b가 일어나는 경우의 수가 n가지이면

     (사건 a와 사건 b가 동시에 일어나는 경우의 수) = m * n (가지)


4. 동전, 주사위를 던지는 경우의 수

   1) n개의 동전을 동시에 던질 때 일어나는 모든 경우의 수

      각각의 동전에 대하여 앞면, 뒷면의 2가지이므로 2ⁿ 가지 이다.

   2) n개의 주사위를 동시에 던질 때 일어나는 모든 경우의 수

      각각의 주사위에 대하여  1,2,3,4,5,6 의 6가지 이므로 6ⁿ 가지 이다.

   3) m개의 동전과 n개의 주사위를 동시에 던질 때 일어나는 모든 경우의 수

      두 사건이 동시에 일어나므로 2^m * 6^n 가지 이다.


5. 한 줄로 세우는 경우의 수

   1) n명을 한 줄로 세우는 경우의 수 

       n * (n-1) * (n - 2) * ... * 2 * 1 (가지)

   2) n명중 2명을 뽑아 한 줄로 세우는 경우의 수 

       n * (n-1)가지


6. 하 줄로 세울 때 이웃하여 세우는 경우의 수

   1) 이웃하는 것을 하나로 묶어 한 줄로 세우는 경우의 수를 구한다.

   2) 묶음 안에서 자리를 바꾸는 경우의 수를 곱한다.


7. 정수를 만드는 경우의 수

   1) 0이 아닌 서로 다른 한 자리 숫자가 각각 적힌 n장의 카드에서

       - 2장을 뽑아 두 자리의 정수를 만드는 경우의 수  >>>  n * (n-1)가지

       - 3장을 뽑아 세 자리의 정수를 만드는 경우의 수  >>>  n * (n-1) * (n-2) 가지

   2) 0이 포함된 서로 다른 한 자리 숫자가 각각 적힌 n장의 카드에서

       - 2장을 뽑아 두 자리의 정수를 만드는 경우의 수  >>>  (n-1) * (n-1)가지

       - 3장을 뽑아 세 자리의 정수를 만드는 경우의 수  >>>  (n-1) * (n-1) * (n-2) 가지

         (n장의 카드에 0이 포함된 경우, 정수의 맨 앞자리에는 0이 올 수 없음으로 맨 앞 자리에 올 수 있는 숫자는 0을 제외)


8. 대표를 뽑는 경우의 수 

    1) 자격이 다른 대표를 뽑는 경우

       - n명 중 자격이 다른 대표 2명을 뽑는 경우의 수  >>>  n * (n-1)가지

       - n명 중 자격이 다른 대표 3명을 뽑는 경우의 수  >>>  n * (n-1) * (n-2) 가지

    2) 자격이 같은 대표를 뽑는 경우

       - n명 중 자격이 같은 대표 2명을 뽑는 경우의 수  >>>  n*(n-1)/2 가지 

       - n명 중 자격이 같은 대표 3명을 뽑는 경우의 수  >>>  n * (n-1) * (n-2) / 3 * 2 * 1 가지


9. 확률의 뜻 

   - 어떤 실험이나 관찰에서 일어날 수 있는 모든 경우의 수가 n가지이고, 각 경우가 일어날 가능성이 같을 때, 어떤 사건 A가 일

     어나는 경우의 수가 a가지면 사건 A가 일어날 확률 p는

     p = (사건 A가 일어나는 경우의 수) / (모든 경우의 수) = a/n


10. 확률의 성질

    1) 확률의 범위

      - 어떤 사건이 일어날 확률을 p라 하면 0 ≤ p ≤ 1 이다 

      - 반드시 일어나는 사건의 확률은 1이다

      - 절대로 일어날 수 없는 사건의 확률은 0이다


    2) 어떤 사건이 일어나지 않을 확률

      - 사건 A가 일어날 확률을 p라 할 때, 사건 A가 일어나지 않을 확률은 1 - p이다


11. 사건 A 또는 사건 B가 일어날 확률(확률의 덧셈)

     사건 A와 사건 B가 동시에 일어나지 않을 때, 사건 A가 일어날 확률을 p, 사건 B가 일어날 확률을 q라 하면

      (사건 A 또는 사건 B가 일어날 확률) = p + q


12. 사건 A와 사건 B가 동시에 일어날 확률(확률의 곱셈)

     두 사건 A, B 가 서로 영향을 끼치지 않을 때, 사건 A가 일어날 확률을 p, 사건 B가 일어날 확률을 q라 하면

      (사건 A와 사건 B가 동시에 일어날 확률) = p * q


13. 연속하여 뽑는 경우의 확률

    1) 꺼낸 것을 다시 넣고 연속하여 뽑는 경우의 확률 

       - 처음 뽑을 때의 전체 개수와 다시 뽑을 때의 전체 개수가 같다.  >>>  처음 사건이 나중 사건에 영향을 주지 않는다 

    2) 꺼낸 것을 다시 넣지 않고 연속하여 뽑는 경우의 확률

       - 처음 뽑을 때의 전체 개수와 다시 뽑을 때의 전체 개수가 다르다  >>>  처음 사건이 나중 사건에 영향을 준다


14. 도형에서의 확률

    - 모든 경우의 수를 도형의 전체 넓이로, 어떤 사건이 일어나는 경우의 수를 사건에 해당하는 부분의 넓이로 생각하여 도형

      에서의 확률을 구할 수 있다.

      (도형에서의 확률) = (사건에 해당하는 부분의 넓이) / (도형의 전체 넓이)

'수학' 카테고리의 다른 글

대푯값과 산포도  (0) 2016.11.07
도수분포와 그래프  (0) 2016.11.02
이차함수  (0) 2016.11.01
일차함수  (0) 2016.11.01
함수  (0) 2016.11.01

1. 큐

   - 큐는 '줄을 서서 기다리다' 라는 뜻을 가지고 있다.

   - 큐는 선입선출 (FIFO : First In, First Out)원리의 자료구조이다.

   - 큐 구조는 컴퓨터 과학 전반에 자주 쓰이는 자료구이다. 예) 버퍼


2. queue 함수

   - void inqueue(int *,int);  // 큐에 데이터를 삽입하는 연산

   - int dequeue(int *);  // 큐에서 데이터를 빼는 연산


3. 소스
  1. #include <stdio.h>
  2.  
  3. int front = -1;
  4. int rear;
  5.  
  6. void inqueue(int *,int);  // 큐에 데이터를 삽입하는 연산
  7. int dequeue(int *);  // 큐에서 데이터를 빼는 연산
  8.  
  9. int main(void)
  10. {
  11.     int arr[10] = {0,};
  12.  
  13.     inqueue(arr,10);
  14.     inqueue(arr,20);
  15.     inqueue(arr,30);
  16.     inqueue(arr,40);
  17.     inqueue(arr,50);
  18.     inqueue(arr,60);
  19.     inqueue(arr,70);
  20.     inqueue(arr,80);
  21.     inqueue(arr,90);
  22.     inqueue(arr,100);
  23.     printf("dequeue = %d\n",dequeue(arr));
  24.     printf("dequeue = %d\n",dequeue(arr));
  25.     printf("dequeue = %d\n",dequeue(arr));
  26.     printf("dequeue = %d\n",dequeue(arr));
  27.     printf("dequeue = %d\n",dequeue(arr));
  28.     printf("dequeue = %d\n",dequeue(arr));
  29.     printf("dequeue = %d\n",dequeue(arr));
  30.     printf("dequeue = %d\n",dequeue(arr));
  31.     printf("dequeue = %d\n",dequeue(arr));
  32.     printf("dequeue = %d\n",dequeue(arr));
  33.  
  34.     return 0;
  35. }
  36.  
  37. void inqueue(int *queue, int data)
  38. {
  39.     if(rear == 9)
  40.         printf("큐가 꽉찾습니다.\n");
  41.     else
  42.     {
  43.         (*(queue + (rear++))) = data;
  44.         printf("Inqueue = %d\n", data);
  45.     }
  46. }
  47.  
  48. int dequeue(int * queue)
  49. {
  50.     int data;
  51.  
  52.     if((front+1) == rear)
  53.     {
  54.         printf("큐에 데이터가 없습니다.");
  55.         return 0;
  56.     }
  57.     else
  58.     {
  59.         data = (*(queue+(++front)));
  60.        
  61.         return data;
  62.     }
  63.  
  64. }

4. 결과화면 

   


1. 도수분포표

   1) 계급 : 변량을 일정한 간격으로 나눈 구간

      - 계급의 크기 : 구간의 너비 또는 계급의 양 끝값의 차

      - 계급의 개수 : 변량을 나눈 구간의 수

      - 계급값 : 계급을 대표하는 값으로 그 계급의 가운데 값

                 계급값 = (계급의 양 끝값의 합)/2

   2) 도수 : 각 계급에 속하는 자료의 개수

   3) 도수분포표 : 주어진 자료를 몇 개의 계급으로 나누고, 각 계급에 속하는 도수를 조사하여 나타낸 표

   4) 자료의 평균 : (변량의 총합) / (변량의 총 개수)

   5) 도수분포표에서의 평균 : ((계급값 x 도수)의 총합) / (도수)의 총합


2. 히스토그램

    - 도수분포표의 각 계급을 가로축에, 그 계급에 속하는 도수를 세로축에 표시하여 직사각형으로 나타낸 그래프

    - 히스토그램의 특징

      1) 도수분포표보다 자료의 분포 상태를 쉽게 알 수 있다.

      2) 각 직사각형의 넓이는 그 계급의 도수에 정비례한다.

      3) 직사각형의 넓이의 합 = 계급의 크기 x 도수의 총합


3. 도수분포다각형

    - 히스토그램에서 각 직사각형의 윗변의 가운데 점을 차례로 선분으로 연결하여 그린 다각형 모양의 그래프

    - 도수분포다각형의 특징

      1) 도수의 분포상태를 연속적으로 관찰할 수 있다.

      2) (도수분포다각형과 가로죽으로 둘러싸인 부분의 넓이) = (히스토그램의 각 직사각형의 넓이의 합)

      3) 2개 이상의 자료의 분포 상태를 한눈에 비교할 수 있다.


4. 상대도수

    - 각 계급의 도수가 전체 도수에서 차지하는 비율

      (어떤 계급의 상대도수) = (그 계급의 도수) / (전체 도수)

    - 상대도수의 특징

      1) 상대도수의 총합은 항상 1이다.

      2) 각 계급의 상대도수는 그 계급의 도수에 정비례한다.

      3) 전체 도수가 다른 두 집단의 분포 상태를 비교할 때 상대도수를 이용하면 편리하다.


5. 상대도수의 분포를 나타낸 그래프

    - 상대도수의 분포표를 히스토그램이나 도수분포다각형과 같은 모양으로 나타낸 그래프

    - 상대도수의 분포를 나타낸 그래프 그리기

      1) 가로축에 계급의 양 끝값, 세로축에 상대도수를 차례로 표시한다.

      2) 히스토그램이나 도수분포다각형과 같은 모양으로 그린다.

    - 활용

      1) 한 그래프에 나타내어 비교하면 한눈에 두 자료의 분포 상태를 쉽게 알 수 있다.

      2) 도수를 그대로 비교하지 않고 상대도수를 구하여 각 계급별로 비교한다.

'수학' 카테고리의 다른 글

대푯값과 산포도  (0) 2016.11.07
경우의 수와 확률  (0) 2016.11.07
이차함수  (0) 2016.11.01
일차함수  (0) 2016.11.01
함수  (0) 2016.11.01

1. 이차함수

   함수 y = f(x) 에서 f(x)가 x에 관한 이차식 y = ax² + bx + c(a,b,c는 상수, a≠0)로 나타내어 질 때
   y 를 x에 관한 이차함수라 한다..

2. 이차함수 y = x²의 그래프
   1) 포물선 : 이차함수의 그래프와 같은 모양의 곡선을 포물선이라 한다.
      - 축 : 포물선은 선대칭도형으로 그 대칭축을 포물선의 축이라 한다.
      - 꼭짓점 : 포물선과 축의 교점을 꼭짓점이라 한다.
   2) 이차함수 y = x²의 그래프 
       - 그래프의 모양 : 아래로 볼록한 포물선
       - 꼭짓점의 좌표 : 원점 (0,0)
       - 축의 방정식 : x = 0 (y축)
       - 그래프의 증가,감소 : x<0일 때, x의 값이 증가하면 y의 값은 감소한다.
                                x>0일 때, x의 값이 증가하면 y의 값도 증가한다.
       - y값의 범위 : y ≥ 0

3. 이차함수 y = ax²의 그래프
       - 꼭짓점의 좌표 : 원점 (0,0)
       - 축의 방정식 : x = 0 (y축)
       - 그래프의 모양 : a > 0 이면 아래로 볼록한 포물선
                           a < 0 이면 위로 볼록한 포물선
       - 그래프의 폭 : a의 절댓값이 클수록 폭이 좁아진다.
                         a의 절댓값이 작을수록 폭이 넓어진다.
       - y값의 범위 : a > 0이면 y ≥ 0
                       a < 0이면 y ≤ 0

4. 이차함수 y = ax²+q의 그래프
        - 이차함수 y = ax²의 그래프를 y축의 방향으로 q만큼 평행이동한 것이다.
        - y = ax²   >>(y축의 방향으로 q만큼 평행이동)>>  y = ax²+q
        - 꼭짓점의 좌표 : (0, q)

5. 이차함수 y=a(x-p)²의 그래프 
        - y = ax²의 그래프를 x축의 방향으로 p만큼 평행이동한 것이다.
        - y = ax²   >>(x축의 방향으로 p만큼 평행이동)>>  y=a(x-p)²
        - 꼭짓점의 좌표 : (p, 0)

6. 이차함수  y=a(x-p)² + q의 그래프
        - 이차함수 y = ax²의 그래프를 x축의 방향으로 p만큼, y축의 방향으로 q만큼 평행이동한 것이다.
        - y = ax²   >>(x축의 방향으로 p만큼 평행이동, y축의 방향으로 q만큼 평행이동)>>  y=a(x-p)²+q
        - 꼭짓점의 좌표 : (p, q)

7. 이차함수 y=ax² + bx + c의 그래프 : y = a(x-p)² + q의 꼴로 고쳐서 그린다.
        - y=ax² + bx + c  >>> y = a(x+b/2a)² - (b²+4ac)/4a
        - 꼭짓점의 좌표 : (-b/2a, -(b²+4ac)/4a)
        - 축의 방정식 : x = -b/2a
        - y축 위의 점의 좌표 : (0, c)

8. 이차함수 y=ax² + bx + c 의 그래프와 x축, y축과의 교점
        - x축과의 교점 : y=0일 때의 x의 값을 구한다.
        - y축과의 교점 : x=0일 때의 y의 값을 구한다.

9. 이차함수 y=ax² + bx + c 의 그래프의 평행이동
        - 이차함수 y=ax² + bx + c의 그래프를 x축의 방향으로 m만큼, y축의 방향으로 n만큼 평행이동한 그래프의 이차함수 식
        - y=ax² + bx + c  >>>  y = a(x-p)²+q 로 변경  >>>  y=a{(x-m)-p}²+q+n

10. 이차함수 y=ax² + bx + c 의 그래프에서 a, b, c의 부호
        1) a의 부호 : 그래프의 모양에 따라 결정된다.
                      - a > 0 : 아래로 볼록한 포물선
                      - a < 0 : 위로 볼록한 포물선
        2) b의 부호 : 축의 위치에 따라 결정된다.
                      - 축이 y축의 왼쪽에 위치  >>> a,b는 서로 같은 부호 (ab>0)
                      - 축이 y축과 일치  >>>  b = 0
                      - 축이 y축의 오른쪽에 위치  >>> a,b 는 서로 다른 부호 (ab>0)
        3) c의 부호 : y축과의 교접의 위치에 따라 결정된다.
                      - y축과의 교점이 x축보다 위쪽  >>> c>0
                      - 원점을 지날 때  >>> c=0
                      - y축과의 교점이 x축보다 아래쪽  >>> c<0

11. 이차함수의 식 구하기 
        1) 꼭짓접의 좌표 (p,q)와 그래프 위의 다른 한 점을 알 때
            이차함수의 식을 y = a(x-p)² + q로 놓고 다른 한 점의 좌표를 대입하여 a의 값을 구한다.
        2) 축의 방정식 x=p와 그래프 위의 두 점을 알 때
            이차함수의 식을 y = a(x-p)² + q로 놓고 주어진 두 점의 좌표를 대입하여 a, q의 값을 구한다.
        3) 그래프 위의 서로 다른 세 점을 알 때
           이차함수의 식을 y = ax² + bx + c 로 놓고 주어진 세 점의 좌표를 대입하여 a, b, c의 값을 구한다.


'수학' 카테고리의 다른 글

경우의 수와 확률  (0) 2016.11.07
도수분포와 그래프  (0) 2016.11.02
일차함수  (0) 2016.11.01
함수  (0) 2016.11.01
인수분해와 이차방정식  (0) 2016.11.01

1. 깊이 우선 탐색(DFS: Depth First Search)



2. 동작원리

  1) 정점 i 를 방문한다

  2) 정점 i에 인접한 정점 중에서 아직 방문하지 않은 정점이 있으면 이 정점들을 모두 스택에 저장

  3) 스택에서 정점을 삭제하여 새로운 i를 설정하고 단계1)을 수행

  4) 스택이 공백이 되면 연산을 종료한다


    
 

3. 소스


  1. void DFS(int * arr, int now,int n) // arr : 스택배열, now : 처음 정점, n : 노드의 개수
  2. {
  3.     int a = 0;
  4.    
  5.     stackpush(arr,0)// 시작 노드를 스택에 push
  6.  
  7.     while(stackempty(top) != -1)
  8.     {
  9.         now = stackpop(arr);       
  10.         if(visit[now] == 0)
  11.         { // 아직 노드를 방문 하지 않음
  12.             printf("%d ",now);
  13.             visit[now] = 1;  // 방문했던 노드를 표시
  14.             for(a=n;a>0;a--)
  15.             {
  16.                 if(visit[a] == 0 && matrix[now][a] == 1) // 인접한 노드중에 방문 안했던 노드를 push
  17.                     stackpush(arr,a);
  18.             }
  19.         }
  20.     }
  21.     printf("\n");
  22.  
  23. }


4. 결과

   

1. 스택 

    - 후입선출(Last-In-First-Out(LIFO)) 원리의 자료구조이다.

    - 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조로 되어있다. 


2. stack 함수

   - int stackpop(int *) : 스택에서 top이 가리키는 요소를 꺼내는 함수

   - void stackpush(int *,int) : 스택에 요소를 삽입하는 함수

   - int stackempty(int) : 스택이 비어있는지 검사 하는 함수


3. 소스 
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. typedef struct node
  5. {
  6.     int data;
  7.     node *pre;
  8. }node;
  9.  
  10. node * top = NULL;
  11.  
  12. int stackisempty(node*);
  13. int stackpop();
  14. void stackpush(int);
  15.  
  16. int main(void)
  17. {
  18.     stackpush(123);
  19.     stackpush(222);
  20.     stackpush(333);
  21.     stackpop();
  22.     stackpop();
  23.     stackpop();
  24.     stackpop();
  25.  
  26.     return 0;
  27. }
  28.  
  29. void stackpush(int data)
  30. {
  31.     node *item = (node *)malloc(sizeof(node));
  32.    
  33.     if(stackisempty == NULL) // 스택이 비어있고 첫 요소를 삽입
  34.     {
  35.         item->pre = NULL;
  36.         item->data = data;
  37.         top = item;
  38.     }
  39.     else  //스택의 처음 요소 이후의 데이터를 삽입
  40.     {
  41.         item->data = data;
  42.         item->pre = top;
  43.         top = item;
  44.     }
  45.     printf("push : %d\n",top->data);
  46. }
  47.  
  48. int stackpop()
  49. {
  50.     node *freenode = NULL;
  51.     int data = 0;
  52.  
  53.     if(stackisempty(top)) //스택이 비어있으면 리턴
  54.         return 0;  
  55.     else    // 스택에 요소가 있을 때
  56.     {          
  57.         data = top->data;
  58.         printf("pop : %d\n",data)
  59.  
  60.         if(stackisempty(top) == 0)
  61.         {
  62.             freenode = top;  // malloc 반환 하기 위한 freenode
  63.             top = top->pre;  // 탑의 위치를 내린다
  64.             free(freenode);  // malloc 메모리를 반환
  65.         }
  66.  
  67.         return data;
  68.     }
  69. }
  70.  
  71. int stackisempty(node *top)
  72. {
  73.     if(top == NULL)
  74.     {
  75.         printf("Stack empty\n");
  76.         return 1;
  77.     }
  78.     else
  79.         return 0;
  80. }
4. 결과
   


1. 스택

   - 후입선출(Last-In-First-Out(LIFO)) 원리의 자료구조이다.

   - 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형구조로 되어있다. 


2. stack 함수

   - int stackpop(int *) : 스택에서 top이 가리키는 요소를 꺼내는 함수

   - void stackpush(int *,int) : 스택에 요소를 삽입하는 함수

   - int stackempty(int) : 스택이 비어있는지 검사 하는 함수


3. 소스 

  1. #include<stdio.h>
  2.  
  3. int stackpop(int *);  // 스택에서 top이 가리키는 요소를 꺼내는 함수
  4. void stackpush(int *,int);  // 스택에 요소를 삽입하는 함수
  5. int stackempty(int);  // 스택이 비어있는지 검사 하는 함수
  6.  
  7. int top = -1;
  8.  
  9. int main(void)
  10. {
  11.     int arr[10] = {0,};
  12.    
  13.    
  14.     stackpush(arr,10);
  15.  
  16.    
  17.     printf("%d\n",stackpop(arr));
  18.  
  19.     stackpop(arr);
  20.  
  21.     return 0;
  22. }
  23.  
  24. int stackpop(int *arr)
  25. {
  26.     int data = 0;
  27.  
  28.     if(stackempty(top) < 0)  // top 의 위치를 검사하고 스택이 비어있으면 NULL을 반환한다.
  29.         return NULL;
  30.     else    // top의 위치를 검사하고 데이터가있으면 스택의 가장 위의 데이터가 반환된다.
  31.     {
  32.         printf("pop -> ");
  33.         data = (*(arr+(top--)));   
  34.         return data;
  35.     }
  36. }
  37.  
  38. void stackpush(int * arr, int data) // 스택에 데이터를 삽입하는 함수
  39. {
  40.     printf("push -> %d\n",data);
  41.     (*(arr+(++top))) = data;
  42. }
  43.  
  44. int stackempty(int top)     // top위치를 검사해 스택의 상태를 반환한다.
  45. {
  46.     if(top < 0)
  47.     {
  48.         printf("Stack empty\n");
  49.         return -1;
  50.     }
  51.     else
  52.         return 1;
  53. }


4. 결과

    

힙 정렬 (Heap-Sort)

- 힙 정렬의 수행시간은 O(n log n) 이다.

- 삽입 정렬과 같이 내부 정렬이다.( 정렬시 입력 배열의 원소를 초과해 배열 밖에 저장하는 일이 없다)



동작 원리

1. 최대(최소) 힙을 구성한다 

2. 루트에 위치한 수와 가장 작은 수를 교환

3. 교환한 수를 제외하고 힙 특성을 유지

4. 2-3의 과정 반복


소스

  1. #include<stdio.h>
  2.  
  3. int * maxheapify(int *,int)// max heap 유지함수
  4.  
  5. int * buildmaxheap(int *, int)// heap 만들기 함수
  6.  
  7. int * heapsort(int *, int)// heap 정렬함수
  8.  
  9. int heapsize;
  10.  
  11. int main(void)
  12. {
  13.     int arr[10] = {691030216831303570 }// 초기 입력 값
  14.     int * heap;
  15.     int a = 0;
  16.  
  17.     printf("변경전 : ");
  18.     for(a= 0;a<10;a++)
  19.     {
  20.         printf("%d ",arr[a]);
  21.     }
  22.  
  23.     heapsize = sizeof(arr)/sizeof(arr[0]);
  24.  
  25.     heap = heapsort(arr, heapsize);
  26.    
  27.    
  28.  
  29.     printf("\n변경후 : ");
  30.     for(a= 0;a<10;a++)
  31.     {
  32.         printf("%d ",arr[a]);
  33.     }
  34.  
  35.  
  36.     return 0;
  37. }
  38.  
  39. int * heapsort(int *arr, int size)
  40. {
  41.     int ch = 0;
  42.     int a = 9;
  43.     int temp = 0;
  44.     int build = 3;
  45.     arr = buildmaxheap(arr,size);
  46.  
  47.     for(;a > 1; a --) // 루트와 맨끝 노드의 값을 변경
  48.     {
  49.         temp = (*arr);
  50.         (*arr) = (*(arr+a));
  51.         (*(arr+a)) = temp;
  52.  
  53.         heapsize --;
  54.  
  55.         arr=    maxheapify(arr,0);
  56.     }
  57.    
  58.     return arr;
  59. }  
  60.  
  61. int * buildmaxheap(int * arr, int a)
  62. {
  63.     int b = a/2 -1;
  64.  
  65.     for(;b >= 0 ;b--)
  66.     {
  67.         maxheapify(arr,b);
  68.     }
  69.  
  70.     return arr;
  71. }
  72.  
  73. int * maxheapify(int  *arr, int a)
  74. {
  75.     int left = 0;
  76.     int right = 0;
  77.     int largest = 0;
  78.     int temp =  0;
  79.     int ch = 0;
  80.  
  81.     if(a == 0)
  82.     {
  83.         left = 1;
  84.         right = 2;
  85.     }
  86.     else
  87.     {
  88.         left = a*2+1;
  89.         right = a*2+2;
  90.     }  
  91.  
  92.     if(left < heapsize && (*(arr+left)) >= (*(arr+a))) // 왼쪽 노드가 더 클때
  93.         largest = left;
  94.     else
  95.         largest = a;    // 아니면 루트
  96.  
  97.     if(right < heapsize && (*(arr+right)) >= (*(arr+largest))) // 오른쪽 노드가 클때
  98.         largest = right;
  99.  
  100.     if(largest != a) //더 큰값으로 루트를 교환한다.
  101.     {
  102.         temp = (*(arr+a));
  103.         (*(arr+a)) = (*(arr+largest));
  104.         (*(arr+largest)) = temp;
  105.  
  106.         maxheapify(arr,largest);
  107.     }
  108.  
  109.     return arr;
  110. }


결과

        

+ Recent posts