SlideShare a Scribd company logo
project #1
project #1


파스칼의 삼각형
파스칼의 삼각형


                    자료구조 D1


             조장: 20083438 김무경
             조원: 20093452 김시백
                 20093460 김정훈
                 20113318 정예린
                 20113319 정진아
순 서


  1. 프로젝트 설명
2. 프로젝트 전체일정
       2-1. 회의록
      3. 업무분담
3-1. 업무분담 개인보고
         4. 초안
       5. 문제점
       6. 해결책
      7. 결과분석
1. 프로젝트 설명
파스칼의 삼각형이란?
1) 파스칼 삼각형




행이 n 열이 k 로 봤을 때 이러한 식이 성립한다.


2)이항계수
  
    



     ··· 
파스칼의 삼각형은 수학에서 이항계수를 삼각형 모양의 기하학적 형태로
배열한 것이다. 이것은 블레즈 파스칼에 의해 이름 붙여졌으나 이미 수세기
전에 다른 사람들에게서 연구된 것이다.
단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다.
   1. 먼저 첫 번째 줄에는 숫자 1을 쓴다.
   1. 그 다음 줄을 만들려면, 바로 위의 왼쪽 숫자와 오른쪽 숫자를 더한
       다. 예를 들어, 네 번째 줄의 숫자 1과 3을 더하여 다섯 번째 줄의 4
       가 만들어진다.
수학적으로, 이 구조는 파스칼의 법칙을 사용하여 아래와 같이 표현한다. n
번째 줄의 k 번째 값을     라고 하면, 이 값은




으로 정의된다. 이때,




라는 성질에 의해




가 성립한다. 즉, n 번째 열의 k 번째 값은      과 같은 값을 가진다.
파스칼의 삼각형은 더 높은 차원으로 확장하여 일반화할 수 있다. 3차원 형태
는 파스칼의 피라미드 또는 파스칼의 4면체로 부른다. 더 높은 차원의 유사체
를 일반적으로 총칭하여 "파스칼의 단체"라고 일컫는다. 피라미드, 사면체,
단체(單體)를 참조하라.
파스칼의 삼각형의 응용
파스칼의 삼각형은 이항 전개에서 계수들의 값을 계산하는 데에 사용된다. 예
를 들어


라는 식에서, 각 계수의 값인 1, 2, 1은 파스칼의 삼각형의 3번째 줄에 대응
된다.
일반적으로,




와 같은 전개식에서,                 가 성립한다. 즉,        는 파스칼의 삼각형의
(n+1) 번째 줄의 (i+1) 번째 값과 대응된다.
자료제공 : 위키백과
http://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98
_%EC%82%BC%EA%B0%81%ED%98%95



과제내용
 1. 배열을 사용하여 n.m을 입력하여 p(n.m)을 구하는 프로그램을
   작성 (n은 1000이하)
 2. 프로그램 디자인 설명
 3. 시간공간 복잡도 설명하고 계산하기

프로젝트를 수행하기 위해 필요한 학습내용
 1. 파스칼의 원리
 2. 2차원배열을 완벽히 이해하고 사용하는 법
 3. 시간복잡도, 공간복잡도의 정의
 4. 시간공간 복잡도를 계산하는 방법
 5. 시간공간 복잡도를 조금이라도 줄이는 대책
2.프로젝트 전체일정
기 간    12. 03. 08    ~ 12. 03. 13   ~ 12. 03. 15

                -알고리즘에 대한   -       알고리즘을 기본으로
                 구체적인 계획 및          한 코딩 작업
    - 조원별 업무 분담 자료 정리
내 용                         -       코딩 결과에 대한
      및 계획 작성
                -알고리즘에 대한           문제점 파악과
                 서로의 의견 나누기         해결방안 제시

기 간   ~ 12. 03. 17   ~ 12. 03. 20   ~ 12. 03. 22

                - 검 과 에 발 된
                   토 정 서 견
    - 해결방안의
                  문제점파악 및 해결 - 최종보고서 검토
내 용   적용과 최종 검토
                - 최종보고서의       및 제출
    - 최종보고서 작성
                  자료 보충
2-1. 회의록
자료구조 01분반 D1:   #1 파스칼의 삼각형
                                     4시      30분부터
 일    시         2012년 3월 8일 (목)
                                     6시      00분까지
 장    소              55110        소집 및 발안자


●회의 내용

*문제에 대한 파악

 - 파스칼의 삼각형을 행과 열을 입력 받아 그 자리의 값을 출력하는 프로그램을 배

 열을 사용하여 c언어로 구현하라.

 - 시간 복잡도와 공간 복잡도를 최대한 줄여서 효율적으로 프로그램을 구현하라.



*프로젝트를 하는데 필요한 학습내용 회의

 - 공간복잡도 시간복잡도 대한 정의 및 계산 방법
 - 이차원배열을 c언어로 사용하는 방법

 - 파스칼 삼각형의 원리



*조원별 업무분담 및 계획 작성

 업무의 종류

 - 문제에 필요한 자료 검색
 - 알고리즘 짜오기

 - 알고리즘을 기반으로 한 c언어 소스 구현
 - 시간 복잡도와 공간 복잡도 계산
 - 문제점 파악 및 보완

 - 보고서 작성
3시     00분부터
 일    시       2012년 3월 13일 (화)
                                     4시     30분까지
 장    소            55110         소집 및 발안자


●회의 내용

*알고리즘 짜 온 것으로 문제 토의

알고리즘 짜 온 것을 다른 조원에게 설명

알고리즘에 대한 의견

-1부터 1000까지 모두 돌아가면 시간복잡도가 커지므로 n까지 도는 것으로 수정

-공간복잡도가 크므로 배열의 크기를 줄이는 방법을 찾기로 결정

⑴ n, m을 입력 받는다.
⑵ n이 1000보다 작은지를 판별한다.
⑶ n이 1000보다 크다면 재입력을 받는다.
⑷ m이 n보다 작은지를 판별한다.
⑸ m이 n보다 크다면 재입력을 받는다.
⑹ 이차원배열을 선언, 좌표에 따라 저장할 수 있도록 구현한다.
⑺ 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다.
⑻ (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다.
⑼ 각 행의 (n.1)의 자리와 (n.n)의 자리에을 저장하도록 한다.
⑽ (n.2)~(n.n-1)은 (n.k)=(n-1.k-1)+(n-1.k)인 규칙에 따라 값을 저장하도록 한다.
⑾ 배열에 파스칼의 삼각형을 위와 같은 원리로 저장, 자리값을 입력받아 값
을 출력한다.
4시      30분부터
 일   시      2012년 3월 15일 (목)
                                  6시      00분까지
 장   소           55110         소집 및 발안자


●회의 내용

*알고리즘을 기반으로 한 소스 구현


*소스구현에 대한 문제점 파악-소스를 실행시켜보고 과제와 비교하고 토의를 통해
문제점을 파악할 수 있었음.
-공간이 작아서 1000*1000배열의 숫자를 모두 담지 못함
-큰 값이 존재하므로 overflow가 일어나 값이 출력이 되지 않음
-이차원배열로 인해 공간복잡도가 큼
-이중포문으로 인해 시간복잡도가 큼


*문제점 해결방안
-문자열로 입력받아 다시 숫자로 바꾸기
-이항정리식을 이용하여 프로그램을 작성
-공간을 없애기 위해서
⑴파스칼의 삼각형에서 위의 행을 이용하여 다음행을 구하는 원리를 이용.
⑵위의 행을 이용하여 다음 행을 저장함.
⑶필요한 맨 마지막 행만 남겨놓고 위의 두 행을 초기화.
⑷남겨놓았던 맨 마지막 행을 다시 첫 행으로 자리를 옮김.
⑸이 과정을 반복하여 결과 값이 필요한 행까지만 배열의 칸을 사용함.


이 알고리즘을 통해 극복 되는 문제점
-1000*1000의 배열→3*1000개의 배열로 수정이 되므로 공간복잡도가 줄어들게 됨.
10시     00분부터
 일   시      2012년 3월 17일 (토)
                                  14시     00분까지
 장   소           50호관          소집 및 발안자


●회의 내용

*문제점파악의 해결 결과에 대한 논의




*최종보고서 작성
3.업무분담

이 름              업   무

김무경 보고서작성, 회의진행 , 프로젝트에 필요한 학습내용 숙지



김정훈 알고리즘 설계와 소스에 대한 문제점 검토와 보완



김시백 문제에 대한 기본원리를 바탕으로 아이디어 제공



정예린 알고리즘을 기반을 한 소스구현 및 코딩작업


      시간복잡도와 공간복잡도에 대한 계산방법과 정의 설
정진아
      명 및 계산
3-1.업무분담 개인보고

김무경

전체적인 보고서 틀을 구상하여 보고서 작성
회의진행
필요한 학습내용 숙지
-배열의사용
type 배열명[크기][크기]...;
type은 어떤 타입의 변수들이 모여 있는지를 지정하는데 정수형 변수들의 모임이면
int, 실수형 변수들의 모임이면 double이라고 적는다. 기본형 외에도 포인터, 구조체,
사용자 정의형 등 임의의 타입이 모두 배열을 구성할 수 있다. 타입 T가 있으면 T
형 배열은 언제나 가능하며 심지어 배열의 배열도 선언할 수 있다.
배열명은 말 그대로 배열의 이름이다. 배열명도 명칭이므로 명칭 규칙에 맞게만 작
성하면 된다. 관습적으로 배열명에는 ar이나 a같은 접두어를 붙여 이 변수가 배열이
라는 것을 쉽게 알 수 있도록 한다. 점수들의 배열이라면 arScore, 사람 이름의 배
열이라면 arName, 좌표의 배열이라면 arPos 등으로 이름을 붙인다.
크기는 이 배열이 몇 개의 요소를 가지는지, 즉 몇 개의 변수가 모여서 배열을 구
성하는지를 지정하는데 자연수로 된 상수를 적어 준다. 개수이기 때문에 음수나 실
수는 당연히 안되며 선언할 때 필요한 메모리양을 계산할 수 있어야 하므로 반드시
상수만 쓸 수 있다. 배열의 차원만큼 크기를 지정하되 2차원 배열이면 [ ] 괄호를
두 번 써 준다.
출처 : http://www.winapi.co.kr/


-시간복잡도
프로그램 P에 의해 소요되는 시간 T(P)는 컴파일 시간과 실행시간을 합한 것이다.
컴파일 시간은 인스턴스 특성에 의존하지 않기 때문에 고정 공간 요구와 유사하다
또한 프로그램이 일단 정확히 수행된다는 것이 검증되면, 그 프로그램을 다시 컴파
일하지 않고도 여러 번 수행할 수 있다. 그렇기 때문에 프로그램의 실행 시간만 염
두에 두면 된다.
-공간복잡도
프로그램이 필요로 하는공간
고정공간과 가변공간의 합이다.          프로그램의 공간복잡도를 분석할 때는 보통
가변공간 요구에 대해서만 관심을 둔다. 이것은 특히 여러 프로그램의 공간
복잡도를 비교하려 할 때 유효하다.


출처 : C로 쓴 자료구조론 P.27




김정훈, 김시백

※ 알고리즘 설계
 1. n, m을 입력 받는다.
 2. n이 1000보다 작은지를 판별한다.
 3. n이 1000보다 크다면 재입력을 받는다.
 4. m이 n보다 작은지를 판별한다.
 5. m이 n보다 크다면 재입력을 받는다.
 6. 이차원배열을 선언 후 파스칼의 삼각형을 좌표에 따라 저장할 수 있도록
   구현한다.
 7. 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다.
 8. (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다.
 9. 각 행의 (n.1)의 자리와 (n.n)의 자리에 1을 저장하도록 한다.
 10. (n.2)~(n.n-1)까지는 (n.k)=(n-1.k-1)+(n-1.k)인 식의 규칙에 따라 값을 저장
    하도록 한다.
 11. 배열에 파스칼의 삼각형을 위와 같은 원리로 저장한 후 원하는 자리를 입
    력받아 값을 출력한다.
정예린, 정진아

알고리즘을 기반을 한 소스구현 및 코딩작업
시간복잡도 공간복잡도 계산방법
#include <stdio.h>
int main(void)
{
       int i,j,n,m; //필요한 변수 선언
     int arr[100][100]; //배열선언
     printf("n,m 두수를 입력 하시오:n);
     scanf("%d %d",&n,&m);
     arr[1][1]=1;
     arr[2][1]=1;
     arr[2][2]=1; //처음 1을 저장
     for(i=3;i<=n;i++) //i는 행
     {
             for(j=1;j<=n;j++)// j는 열
             {
                     if(i==j) //행과 열이 같다면 그 자리에 1을 저장
                     {
                  arr[i][j]=1;
                  }
                  else if(j==1) // 첫 번째 열에는 항상 1을 저장
                  {
                           arr[i][j]=1;
                  }
                  else
                  {
                         arr[i][j]=arr[i-1][j] +arr[i-1][j-1];
                  }
           }
     }
     printf("arr(%d,%d)=%d",n,m,arr[n][m]); //출력
     return 0;
}


-시간복잡도 공간복잡도 계산방법


보통은 알고리즘의 효율성을 판단하는 기준은
1. 시간복잡도
2. 공간복잡도
크게 2가지로 나뉩니다.
시간복잡도는 얼마나 빠르게 실행되느냐에 대한 것이고
공간복잡도는 얼마나 많이 기억공간(메모리)을 차지 하느냐에 대한 것입니다.


시간복잡도 함수 : 입력의 개수 n의 함수로 나타낸것


hello world 란 글자를 3번출력하는 알고리즘을 구현해보죠


A.
int main()
{
    printf("hello world n");
    printf("hello world n");
    printf("hello world n");
}


B.
int main()
{
    int i ;
    for(i = 0; i <3; i++)
    printf("hello world n");
}
이 A, B는 같은 결과를 도출합니다.
단 printf()호출은 수행시간 1로 보겠습니다.


하지만 연산의 개수를 본다면 A는 3
A.수행속도---> 3


B는 총 n+n+n+1번의 연산을 하죠 즉 7번
대입연산 i = 0 : 1번
비교연산 i<3 : 3번
증가연산 i++ : 3번
printf() : 3
B.수행속도---> 3n + 1


위의 방법을 본다면 입력의 개수 n




즉 여기선 더 많은 printf()를 찍어 낸다면 n이 커질수록 수행시간은 엄청난 차이를
가져
올것입니다. n이 커질수록 알고리즘간의 차이는 커지게 됩니다.
이런 방법으로 하나의 효율적인 알고리즘 구현방법을 알 수 있습니다.


어떻게 구현하느냐에 따라서 2차원 이상의 함수도 도출이 가능합니다.
4.초안
 1. n, m을 입력 받는다.
 2. n이 1000보다 작은지를 판별한다.
 3. n이 1000보다 크다면 재입력을 받는다.
 4. m이 n보다 작은지를 판별한다.
 5. m이 n보다 크다면 재입력을 받는다.
 6. 이차원배열을 선언, 좌표에 따라 저장할 수 있도록 구현한다.
 7. 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다.
 8. (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다.
 9. 각 행의 (n.1)의 자리와 (n.n)의 자리에을 저장하도록 한다.
 10. (n.2)~(n.n-1)은 (n.k)=(n-1.k-1)+(n-1.k)인 규칙에 따라 값을 저장하도록
     한다.
 11. 배열에 파스칼의 삼각형을 위와 같은 원리로 저장, 자리값을 입력받아
     값을 출력한다.


초안 소스  


#include <stdio.h>
int main(void)
{
       int i,j,n,m; //필요한 변수 선언
       int arr[1000][1000]; //배열선언
      printf("n,m 두수를 입력 하시오:n);
      scanf("%d %d",&n,&m);
      arr[1][1]=1;
      arr[2][1]=1;
      arr[2][2]=1; //처음 1을 저장
      for(i=3;i<=n;i++) //i는 행
      {
            for(j=1;j<=n;j++)// j는 열
            {
if(i==j) //행과 열이 같다면 그 자리에 1을 저장
             {
             arr[i][j]=1;
             }
             else if(j==1) // 첫 번째 열에는 항상 1을 저장
             {
                    arr[i][j]=1;
             }
             else
             {
                    arr[i][j]=arr[i-1][j] +arr[i-1][j-1];
             }
      }
}
printf("arr(%d,%d)=%d",n,m,arr[n][m]); //출력
return 0;


}
5.문제점
1.
1000*1000 이하의 숫자를 입력받는 과제인데
1000*1000개의 배열을 선언 할 수 없음




 <1000*1000 배열을 선언햇을 때 시스템오류>


 2. 행과 열이 어느순간 커지면 이상한 값이 나온다.




 <행과 열이 어느순간부터 값이 다르게 나온다>


 3. 공간복잡도가 지나치게 큼
     -int가 4바이트이므로 1000x1000배열을 선언했을 때
     공간복잡도는 4x1000x1000이 되므로 너무 크다.
6.해결방안

- 문자열로 입력받아 다시 숫자로 바꾸기
    char형의 배열은 숫자를 문자 취급 하므로 길게 받을 수 있다.
    이 원리를 이용하여 overflow가 일어나는 숫자를 출력할 수 있도록 한다.
    1. char형의 배열을 선언한다.
    2. 선언된 배열에 숫자 값을 저장한다.
    3. overflow가 일어나는 자리 수만큼 끊어서 atoi함수를 이용하여 숫자로 바꾸
      어 준다.
    4. int형으로 변환된 char형의 값을 출력한다.


- 이항정리 식을 이용하여 프로그램을 작성
    조합의 기본 공식을 이용하여 값을 저장한다.
    1. 출력할 자리좌표를 입력 받는다.
    2. 자리좌표의 조합공식에 적용 될 수 있는 n과 r을 구한다.
    3. 아래의 공식에 n과 r을 대입하여 값을 계산한다.
                                         
    4. 조합의 기본공식 :   
                                  ·   
    5. 구한 값을 출력한다.


이항정리식을 이용하여 만든 소스
#include <stdio.h>
#include <stdlib.h>
unsigned long long d[1001][1001];
unsigned long long n,m;
int main()
{
     unsigned long i,j;
     d[1][1] = 1;
     printf("파스칼 삼각형의 행과 열을 입력하면 그좌표 값이 나오는 프로그램입니다.n");
     scnaf("%d%d",a,b);
for(i=2; i<=1000; i++)
    {
        d[i][1] = 1;
        d[i][i] = 1;
        for(j=2; j<n; j++)
        {
             d[i][j]=d[i-1][j-1]+d[i-1][j];
        }
    }
    printf("결과 : %4d ",d[n][m]);
    printf("n");
    system("pause");
    return 0;
}
문제점 : 펙토리얼을 쓸 경우 값이 커지면 오버플로우가 나서
             계산이 되지 않는다


- 공간을 없애기 위해서
    1. 파스칼의 삼각형에서 위의 행을 이용하여 다음 행을 구하는 원리를 이용.
    2. 위의 행을 이용하여 다음 행을 저장함.
    3. 필요한 맨 마지막 행만 남겨놓고 위의 두 행을 초기화.
    4. 남겨놓았던 맨 마지막 행을 다시 첫 행으로 자리를 옮김.
    5. 이 과정을 반복하여 결과 값이 필요한 행까지만 배열의 칸을 사용함.
그 결과 공간복잡도
1000*1000의 배열→3*1000개의 배열로 수정이 되므로 공간복잡도가
줄어들게 됨.
7.결과분석

#include <stdio.h>


int p[1000][1000];                                 //1


void main()
{
     int m,n,i,j;                                  //1
     p[1][1] = 1;                                    //1
     printf("파스칼 삼각형의 1000이하의 행과 열을 입력(조건:행>열)n"); //1
     scanf("%d%d",&n,&m);                                //1


     for(i=2; i<=n; i++)                                 // n-1
     {
          p[i][1] = 1;
          p[i][i] = 1;
          for(j=2; j<n; j++)                             // (n-1)*(n-2)
          {
                 p[i][j]=p[i-1][j-1]+p[i-1][j];
          }
     }
     printf("결과 : %d ",p[n][m]);                   //1
     printf("n");                                  //1
}
시간복잡도 : n-1 + (n-1)*(n-2) + 8
               =n-1 +            -3n+2+8

               =  -2n+9
T(n)=  -2n+9
최악의 경우 : O(  )                             평균적 경우 :       (  )

최상의 경우 :              (  )



공간복잡도 : 4 * 1000 * 1000
                    =4,000,000byte
2012 Ds 01
2012 Ds 01

More Related Content

What's hot

이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
KoChungWook
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2
KoChungWook
 
컴퓨터 프로그램 구조와 해석 3.5
컴퓨터 프로그램 구조와 해석 3.5컴퓨터 프로그램 구조와 해석 3.5
컴퓨터 프로그램 구조와 해석 3.5
HyeonSeok Choi
 

What's hot (20)

알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdols알고리즘 스터디(정렬) Seungdols
알고리즘 스터디(정렬) Seungdols
 
Mathematics
MathematicsMathematics
Mathematics
 
이산치수학 Project4
이산치수학 Project4이산치수학 Project4
이산치수학 Project4
 
파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기파이썬 Numpy 선형대수 이해하기
파이썬 Numpy 선형대수 이해하기
 
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제 풀이
 
python 수학이해하기
python 수학이해하기python 수학이해하기
python 수학이해하기
 
컴퓨터개론09
컴퓨터개론09컴퓨터개론09
컴퓨터개론09
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
 
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조
 
자료구조 Project2
자료구조 Project2자료구조 Project2
자료구조 Project2
 
R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작R 프로그래밍-향상된 데이타 조작
R 프로그래밍-향상된 데이타 조작
 
Tensorflow for Deep Learning(SK Planet)
Tensorflow for Deep Learning(SK Planet)Tensorflow for Deep Learning(SK Planet)
Tensorflow for Deep Learning(SK Planet)
 
컴퓨터 프로그램 구조와 해석 3.5
컴퓨터 프로그램 구조와 해석 3.5컴퓨터 프로그램 구조와 해석 3.5
컴퓨터 프로그램 구조와 해석 3.5
 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
 
R 프로그래밍 기본 문법
R 프로그래밍 기본 문법R 프로그래밍 기본 문법
R 프로그래밍 기본 문법
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS
 
자료구조 프로젝트
자료구조 프로젝트자료구조 프로젝트
자료구조 프로젝트
 
선형 대수학
선형 대수학선형 대수학
선형 대수학
 
2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차
 
강의자료3
강의자료3강의자료3
강의자료3
 

Similar to 2012 Ds 01 (20)

자료구조01
자료구조01자료구조01
자료구조01
 
자구2번
자구2번자구2번
자구2번
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf2012 Dm A0 07 Pdf
2012 Dm A0 07 Pdf
 
이산치 과제7
이산치 과제7이산치 과제7
이산치 과제7
 
자료구조 Project1
자료구조 Project1자료구조 Project1
자료구조 Project1
 
자료구조2보고서
자료구조2보고서자료구조2보고서
자료구조2보고서
 
Howto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHowto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear Regression
 
3주차 스터디
3주차 스터디3주차 스터디
3주차 스터디
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 
2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)2012 Dm B3 보고서(06박찬흥)
2012 Dm B3 보고서(06박찬흥)
 
2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)2012 Dm B3 보고서(10백지원)
2012 Dm B3 보고서(10백지원)
 

More from Jungyerin

More from Jungyerin (9)

2012 Ds 06
2012 Ds 062012 Ds 06
2012 Ds 06
 
2012 Ds 05
2012 Ds 052012 Ds 05
2012 Ds 05
 
2012 Ds 04
2012 Ds 042012 Ds 04
2012 Ds 04
 
2012 Ds 03
2012 Ds 032012 Ds 03
2012 Ds 03
 
2012 Ds 02
2012 Ds 022012 Ds 02
2012 Ds 02
 
2012 Dm 07
2012 Dm 072012 Dm 07
2012 Dm 07
 
2012 Dm 04
2012 Dm 042012 Dm 04
2012 Dm 04
 
2012 Dm 02
2012 Dm 022012 Dm 02
2012 Dm 02
 
2012 Dm 01
2012 Dm 012012 Dm 01
2012 Dm 01
 

2012 Ds 01

  • 1. project #1 project #1 파스칼의 삼각형 파스칼의 삼각형 자료구조 D1 조장: 20083438 김무경 조원: 20093452 김시백 20093460 김정훈 20113318 정예린 20113319 정진아
  • 2. 순 서 1. 프로젝트 설명 2. 프로젝트 전체일정 2-1. 회의록 3. 업무분담 3-1. 업무분담 개인보고 4. 초안 5. 문제점 6. 해결책 7. 결과분석
  • 3. 1. 프로젝트 설명 파스칼의 삼각형이란? 1) 파스칼 삼각형 행이 n 열이 k 로 봤을 때 이러한 식이 성립한다. 2)이항계수                 ··· 
  • 4. 파스칼의 삼각형은 수학에서 이항계수를 삼각형 모양의 기하학적 형태로 배열한 것이다. 이것은 블레즈 파스칼에 의해 이름 붙여졌으나 이미 수세기 전에 다른 사람들에게서 연구된 것이다. 단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다. 1. 먼저 첫 번째 줄에는 숫자 1을 쓴다. 1. 그 다음 줄을 만들려면, 바로 위의 왼쪽 숫자와 오른쪽 숫자를 더한 다. 예를 들어, 네 번째 줄의 숫자 1과 3을 더하여 다섯 번째 줄의 4 가 만들어진다. 수학적으로, 이 구조는 파스칼의 법칙을 사용하여 아래와 같이 표현한다. n 번째 줄의 k 번째 값을 라고 하면, 이 값은 으로 정의된다. 이때, 라는 성질에 의해 가 성립한다. 즉, n 번째 열의 k 번째 값은 과 같은 값을 가진다. 파스칼의 삼각형은 더 높은 차원으로 확장하여 일반화할 수 있다. 3차원 형태 는 파스칼의 피라미드 또는 파스칼의 4면체로 부른다. 더 높은 차원의 유사체 를 일반적으로 총칭하여 "파스칼의 단체"라고 일컫는다. 피라미드, 사면체, 단체(單體)를 참조하라. 파스칼의 삼각형의 응용 파스칼의 삼각형은 이항 전개에서 계수들의 값을 계산하는 데에 사용된다. 예 를 들어 라는 식에서, 각 계수의 값인 1, 2, 1은 파스칼의 삼각형의 3번째 줄에 대응
  • 5. 된다. 일반적으로, 와 같은 전개식에서, 가 성립한다. 즉, 는 파스칼의 삼각형의 (n+1) 번째 줄의 (i+1) 번째 값과 대응된다. 자료제공 : 위키백과 http://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98 _%EC%82%BC%EA%B0%81%ED%98%95 과제내용 1. 배열을 사용하여 n.m을 입력하여 p(n.m)을 구하는 프로그램을 작성 (n은 1000이하) 2. 프로그램 디자인 설명 3. 시간공간 복잡도 설명하고 계산하기 프로젝트를 수행하기 위해 필요한 학습내용 1. 파스칼의 원리 2. 2차원배열을 완벽히 이해하고 사용하는 법 3. 시간복잡도, 공간복잡도의 정의 4. 시간공간 복잡도를 계산하는 방법 5. 시간공간 복잡도를 조금이라도 줄이는 대책
  • 6. 2.프로젝트 전체일정 기 간 12. 03. 08 ~ 12. 03. 13 ~ 12. 03. 15 -알고리즘에 대한 - 알고리즘을 기본으로 구체적인 계획 및 한 코딩 작업 - 조원별 업무 분담 자료 정리 내 용 - 코딩 결과에 대한 및 계획 작성 -알고리즘에 대한 문제점 파악과 서로의 의견 나누기 해결방안 제시 기 간 ~ 12. 03. 17 ~ 12. 03. 20 ~ 12. 03. 22 - 검 과 에 발 된 토 정 서 견 - 해결방안의 문제점파악 및 해결 - 최종보고서 검토 내 용 적용과 최종 검토 - 최종보고서의 및 제출 - 최종보고서 작성 자료 보충
  • 7. 2-1. 회의록 자료구조 01분반 D1: #1 파스칼의 삼각형 4시 30분부터 일 시 2012년 3월 8일 (목) 6시 00분까지 장 소 55110 소집 및 발안자 ●회의 내용 *문제에 대한 파악 - 파스칼의 삼각형을 행과 열을 입력 받아 그 자리의 값을 출력하는 프로그램을 배 열을 사용하여 c언어로 구현하라. - 시간 복잡도와 공간 복잡도를 최대한 줄여서 효율적으로 프로그램을 구현하라. *프로젝트를 하는데 필요한 학습내용 회의 - 공간복잡도 시간복잡도 대한 정의 및 계산 방법 - 이차원배열을 c언어로 사용하는 방법 - 파스칼 삼각형의 원리 *조원별 업무분담 및 계획 작성 업무의 종류 - 문제에 필요한 자료 검색 - 알고리즘 짜오기 - 알고리즘을 기반으로 한 c언어 소스 구현 - 시간 복잡도와 공간 복잡도 계산 - 문제점 파악 및 보완 - 보고서 작성
  • 8. 3시 00분부터 일 시 2012년 3월 13일 (화) 4시 30분까지 장 소 55110 소집 및 발안자 ●회의 내용 *알고리즘 짜 온 것으로 문제 토의 알고리즘 짜 온 것을 다른 조원에게 설명 알고리즘에 대한 의견 -1부터 1000까지 모두 돌아가면 시간복잡도가 커지므로 n까지 도는 것으로 수정 -공간복잡도가 크므로 배열의 크기를 줄이는 방법을 찾기로 결정 ⑴ n, m을 입력 받는다. ⑵ n이 1000보다 작은지를 판별한다. ⑶ n이 1000보다 크다면 재입력을 받는다. ⑷ m이 n보다 작은지를 판별한다. ⑸ m이 n보다 크다면 재입력을 받는다. ⑹ 이차원배열을 선언, 좌표에 따라 저장할 수 있도록 구현한다. ⑺ 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다. ⑻ (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다. ⑼ 각 행의 (n.1)의 자리와 (n.n)의 자리에을 저장하도록 한다. ⑽ (n.2)~(n.n-1)은 (n.k)=(n-1.k-1)+(n-1.k)인 규칙에 따라 값을 저장하도록 한다. ⑾ 배열에 파스칼의 삼각형을 위와 같은 원리로 저장, 자리값을 입력받아 값 을 출력한다.
  • 9. 4시 30분부터 일 시 2012년 3월 15일 (목) 6시 00분까지 장 소 55110 소집 및 발안자 ●회의 내용 *알고리즘을 기반으로 한 소스 구현 *소스구현에 대한 문제점 파악-소스를 실행시켜보고 과제와 비교하고 토의를 통해 문제점을 파악할 수 있었음. -공간이 작아서 1000*1000배열의 숫자를 모두 담지 못함 -큰 값이 존재하므로 overflow가 일어나 값이 출력이 되지 않음 -이차원배열로 인해 공간복잡도가 큼 -이중포문으로 인해 시간복잡도가 큼 *문제점 해결방안 -문자열로 입력받아 다시 숫자로 바꾸기 -이항정리식을 이용하여 프로그램을 작성 -공간을 없애기 위해서 ⑴파스칼의 삼각형에서 위의 행을 이용하여 다음행을 구하는 원리를 이용. ⑵위의 행을 이용하여 다음 행을 저장함. ⑶필요한 맨 마지막 행만 남겨놓고 위의 두 행을 초기화. ⑷남겨놓았던 맨 마지막 행을 다시 첫 행으로 자리를 옮김. ⑸이 과정을 반복하여 결과 값이 필요한 행까지만 배열의 칸을 사용함. 이 알고리즘을 통해 극복 되는 문제점 -1000*1000의 배열→3*1000개의 배열로 수정이 되므로 공간복잡도가 줄어들게 됨.
  • 10. 10시 00분부터 일 시 2012년 3월 17일 (토) 14시 00분까지 장 소 50호관 소집 및 발안자 ●회의 내용 *문제점파악의 해결 결과에 대한 논의 *최종보고서 작성
  • 11. 3.업무분담 이 름 업 무 김무경 보고서작성, 회의진행 , 프로젝트에 필요한 학습내용 숙지 김정훈 알고리즘 설계와 소스에 대한 문제점 검토와 보완 김시백 문제에 대한 기본원리를 바탕으로 아이디어 제공 정예린 알고리즘을 기반을 한 소스구현 및 코딩작업 시간복잡도와 공간복잡도에 대한 계산방법과 정의 설 정진아 명 및 계산
  • 12. 3-1.업무분담 개인보고 김무경 전체적인 보고서 틀을 구상하여 보고서 작성 회의진행 필요한 학습내용 숙지 -배열의사용 type 배열명[크기][크기]...; type은 어떤 타입의 변수들이 모여 있는지를 지정하는데 정수형 변수들의 모임이면 int, 실수형 변수들의 모임이면 double이라고 적는다. 기본형 외에도 포인터, 구조체, 사용자 정의형 등 임의의 타입이 모두 배열을 구성할 수 있다. 타입 T가 있으면 T 형 배열은 언제나 가능하며 심지어 배열의 배열도 선언할 수 있다. 배열명은 말 그대로 배열의 이름이다. 배열명도 명칭이므로 명칭 규칙에 맞게만 작 성하면 된다. 관습적으로 배열명에는 ar이나 a같은 접두어를 붙여 이 변수가 배열이 라는 것을 쉽게 알 수 있도록 한다. 점수들의 배열이라면 arScore, 사람 이름의 배 열이라면 arName, 좌표의 배열이라면 arPos 등으로 이름을 붙인다. 크기는 이 배열이 몇 개의 요소를 가지는지, 즉 몇 개의 변수가 모여서 배열을 구 성하는지를 지정하는데 자연수로 된 상수를 적어 준다. 개수이기 때문에 음수나 실 수는 당연히 안되며 선언할 때 필요한 메모리양을 계산할 수 있어야 하므로 반드시 상수만 쓸 수 있다. 배열의 차원만큼 크기를 지정하되 2차원 배열이면 [ ] 괄호를 두 번 써 준다. 출처 : http://www.winapi.co.kr/ -시간복잡도 프로그램 P에 의해 소요되는 시간 T(P)는 컴파일 시간과 실행시간을 합한 것이다. 컴파일 시간은 인스턴스 특성에 의존하지 않기 때문에 고정 공간 요구와 유사하다 또한 프로그램이 일단 정확히 수행된다는 것이 검증되면, 그 프로그램을 다시 컴파 일하지 않고도 여러 번 수행할 수 있다. 그렇기 때문에 프로그램의 실행 시간만 염 두에 두면 된다.
  • 13. -공간복잡도 프로그램이 필요로 하는공간 고정공간과 가변공간의 합이다. 프로그램의 공간복잡도를 분석할 때는 보통 가변공간 요구에 대해서만 관심을 둔다. 이것은 특히 여러 프로그램의 공간 복잡도를 비교하려 할 때 유효하다. 출처 : C로 쓴 자료구조론 P.27 김정훈, 김시백 ※ 알고리즘 설계 1. n, m을 입력 받는다. 2. n이 1000보다 작은지를 판별한다. 3. n이 1000보다 크다면 재입력을 받는다. 4. m이 n보다 작은지를 판별한다. 5. m이 n보다 크다면 재입력을 받는다. 6. 이차원배열을 선언 후 파스칼의 삼각형을 좌표에 따라 저장할 수 있도록 구현한다. 7. 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다. 8. (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다. 9. 각 행의 (n.1)의 자리와 (n.n)의 자리에 1을 저장하도록 한다. 10. (n.2)~(n.n-1)까지는 (n.k)=(n-1.k-1)+(n-1.k)인 식의 규칙에 따라 값을 저장 하도록 한다. 11. 배열에 파스칼의 삼각형을 위와 같은 원리로 저장한 후 원하는 자리를 입 력받아 값을 출력한다.
  • 14.
  • 15. 정예린, 정진아 알고리즘을 기반을 한 소스구현 및 코딩작업 시간복잡도 공간복잡도 계산방법 #include <stdio.h> int main(void) { int i,j,n,m; //필요한 변수 선언 int arr[100][100]; //배열선언 printf("n,m 두수를 입력 하시오:n); scanf("%d %d",&n,&m); arr[1][1]=1; arr[2][1]=1; arr[2][2]=1; //처음 1을 저장 for(i=3;i<=n;i++) //i는 행 { for(j=1;j<=n;j++)// j는 열 { if(i==j) //행과 열이 같다면 그 자리에 1을 저장 { arr[i][j]=1; } else if(j==1) // 첫 번째 열에는 항상 1을 저장 { arr[i][j]=1; } else { arr[i][j]=arr[i-1][j] +arr[i-1][j-1]; } } } printf("arr(%d,%d)=%d",n,m,arr[n][m]); //출력 return 0;
  • 16. } -시간복잡도 공간복잡도 계산방법 보통은 알고리즘의 효율성을 판단하는 기준은 1. 시간복잡도 2. 공간복잡도 크게 2가지로 나뉩니다. 시간복잡도는 얼마나 빠르게 실행되느냐에 대한 것이고 공간복잡도는 얼마나 많이 기억공간(메모리)을 차지 하느냐에 대한 것입니다. 시간복잡도 함수 : 입력의 개수 n의 함수로 나타낸것 hello world 란 글자를 3번출력하는 알고리즘을 구현해보죠 A. int main() { printf("hello world n"); printf("hello world n"); printf("hello world n"); } B. int main() { int i ; for(i = 0; i <3; i++) printf("hello world n"); }
  • 17. 이 A, B는 같은 결과를 도출합니다. 단 printf()호출은 수행시간 1로 보겠습니다. 하지만 연산의 개수를 본다면 A는 3 A.수행속도---> 3 B는 총 n+n+n+1번의 연산을 하죠 즉 7번 대입연산 i = 0 : 1번 비교연산 i<3 : 3번 증가연산 i++ : 3번 printf() : 3 B.수행속도---> 3n + 1 위의 방법을 본다면 입력의 개수 n 즉 여기선 더 많은 printf()를 찍어 낸다면 n이 커질수록 수행시간은 엄청난 차이를 가져 올것입니다. n이 커질수록 알고리즘간의 차이는 커지게 됩니다. 이런 방법으로 하나의 효율적인 알고리즘 구현방법을 알 수 있습니다. 어떻게 구현하느냐에 따라서 2차원 이상의 함수도 도출이 가능합니다.
  • 18. 4.초안 1. n, m을 입력 받는다. 2. n이 1000보다 작은지를 판별한다. 3. n이 1000보다 크다면 재입력을 받는다. 4. m이 n보다 작은지를 판별한다. 5. m이 n보다 크다면 재입력을 받는다. 6. 이차원배열을 선언, 좌표에 따라 저장할 수 있도록 구현한다. 7. 이중 포문을 이용해 n을 행으로 m을 열로 보고 입력을 받는다. 8. (1.1), (2.1), (2.2)에는 처음에 값을 1로 저장할 수 있도록 한다. 9. 각 행의 (n.1)의 자리와 (n.n)의 자리에을 저장하도록 한다. 10. (n.2)~(n.n-1)은 (n.k)=(n-1.k-1)+(n-1.k)인 규칙에 따라 값을 저장하도록 한다. 11. 배열에 파스칼의 삼각형을 위와 같은 원리로 저장, 자리값을 입력받아 값을 출력한다. 초안 소스   #include <stdio.h> int main(void) { int i,j,n,m; //필요한 변수 선언 int arr[1000][1000]; //배열선언 printf("n,m 두수를 입력 하시오:n); scanf("%d %d",&n,&m); arr[1][1]=1; arr[2][1]=1; arr[2][2]=1; //처음 1을 저장 for(i=3;i<=n;i++) //i는 행 { for(j=1;j<=n;j++)// j는 열 {
  • 19. if(i==j) //행과 열이 같다면 그 자리에 1을 저장 { arr[i][j]=1; } else if(j==1) // 첫 번째 열에는 항상 1을 저장 { arr[i][j]=1; } else { arr[i][j]=arr[i-1][j] +arr[i-1][j-1]; } } } printf("arr(%d,%d)=%d",n,m,arr[n][m]); //출력 return 0; }
  • 20. 5.문제점 1. 1000*1000 이하의 숫자를 입력받는 과제인데 1000*1000개의 배열을 선언 할 수 없음 <1000*1000 배열을 선언햇을 때 시스템오류> 2. 행과 열이 어느순간 커지면 이상한 값이 나온다. <행과 열이 어느순간부터 값이 다르게 나온다> 3. 공간복잡도가 지나치게 큼 -int가 4바이트이므로 1000x1000배열을 선언했을 때 공간복잡도는 4x1000x1000이 되므로 너무 크다.
  • 21. 6.해결방안 - 문자열로 입력받아 다시 숫자로 바꾸기 char형의 배열은 숫자를 문자 취급 하므로 길게 받을 수 있다. 이 원리를 이용하여 overflow가 일어나는 숫자를 출력할 수 있도록 한다. 1. char형의 배열을 선언한다. 2. 선언된 배열에 숫자 값을 저장한다. 3. overflow가 일어나는 자리 수만큼 끊어서 atoi함수를 이용하여 숫자로 바꾸 어 준다. 4. int형으로 변환된 char형의 값을 출력한다. - 이항정리 식을 이용하여 프로그램을 작성 조합의 기본 공식을 이용하여 값을 저장한다. 1. 출력할 자리좌표를 입력 받는다. 2. 자리좌표의 조합공식에 적용 될 수 있는 n과 r을 구한다. 3. 아래의 공식에 n과 r을 대입하여 값을 계산한다.  4. 조합의 기본공식 :        ·    5. 구한 값을 출력한다. 이항정리식을 이용하여 만든 소스 #include <stdio.h> #include <stdlib.h> unsigned long long d[1001][1001]; unsigned long long n,m; int main() { unsigned long i,j; d[1][1] = 1; printf("파스칼 삼각형의 행과 열을 입력하면 그좌표 값이 나오는 프로그램입니다.n"); scnaf("%d%d",a,b);
  • 22. for(i=2; i<=1000; i++) { d[i][1] = 1; d[i][i] = 1; for(j=2; j<n; j++) { d[i][j]=d[i-1][j-1]+d[i-1][j]; } } printf("결과 : %4d ",d[n][m]); printf("n"); system("pause"); return 0; } 문제점 : 펙토리얼을 쓸 경우 값이 커지면 오버플로우가 나서 계산이 되지 않는다 - 공간을 없애기 위해서 1. 파스칼의 삼각형에서 위의 행을 이용하여 다음 행을 구하는 원리를 이용. 2. 위의 행을 이용하여 다음 행을 저장함. 3. 필요한 맨 마지막 행만 남겨놓고 위의 두 행을 초기화. 4. 남겨놓았던 맨 마지막 행을 다시 첫 행으로 자리를 옮김. 5. 이 과정을 반복하여 결과 값이 필요한 행까지만 배열의 칸을 사용함. 그 결과 공간복잡도 1000*1000의 배열→3*1000개의 배열로 수정이 되므로 공간복잡도가 줄어들게 됨.
  • 23. 7.결과분석 #include <stdio.h> int p[1000][1000]; //1 void main() { int m,n,i,j; //1 p[1][1] = 1; //1 printf("파스칼 삼각형의 1000이하의 행과 열을 입력(조건:행>열)n"); //1 scanf("%d%d",&n,&m); //1 for(i=2; i<=n; i++) // n-1 { p[i][1] = 1; p[i][i] = 1; for(j=2; j<n; j++) // (n-1)*(n-2) { p[i][j]=p[i-1][j-1]+p[i-1][j]; } } printf("결과 : %d ",p[n][m]); //1 printf("n"); //1 } 시간복잡도 : n-1 + (n-1)*(n-2) + 8 =n-1 +  -3n+2+8 =  -2n+9 T(n)=  -2n+9 최악의 경우 : O(  ) 평균적 경우 :  (  ) 최상의 경우 :  (  ) 공간복잡도 : 4 * 1000 * 1000 =4,000,000byte