SlideShare a Scribd company logo
1 of 12
Download to read offline
팀 명   D0


    조원 profile
20093447 : 김도형
20113311 : 장동규
20093489 : 송하윤

20113324 : 최수영
과 제 수 행 일 지


이름: 20소속 : 자료구조 01분반 D0조


093447 김도형 ,20093489 송하윤 ,20113324 최수영 ,20113311 장동규


과제수행기간: 14일 5번 모임 총     10시간


I. 계획의 작성

 ①연구제목: 파스칼의 삼각형
 ②연구배경: Array에 대한 이해
 ③참고자료: Fundamentals of Data Structures in C
             구글검색 , 책(열혈강의 C프로그래밍)
             시간 공간 복잡도 참고:
 http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68494777&qb
 =U3BhY2UgY29tcGxleGl0eQ==&enc=utf8&section=kin&rank=3&search_sort=0&sp
 q=0


 II. 목차

       - 임무분담에 대하여 ( 3쪽 )


       - 알고리즘 순서도 ( 4쪽 )


       - 계획의 실행 ( 5~10쪽 )


       - 시간,공간 복잡도의 계산 ( 11쪽 )


        - 과제를 마치면서( 마지막 쪽 )
※ 임무 분담에 대하여



조장 : 김도형
보고서 작성, 최종 종합, 프로그램 설명서.

알고리즘 : 장동규
자연식의 계산 원리를 파악하여 프로그램에 대입하는 역할.


코딩 : 김도형
프로그램에 대하여 구조 개선 및 문제점 해결.


자료검토 및 스케줄 : 송하윤
토론 계획 및 스케줄 관리 준비된 자료 재검토.


검색 및 토의종합 : 최수영
토의 한 내용 기록 및 문제 및 궁금점 조사.
● 알고리즘 순서도



(n과 m에 대해서는 임의의 숫자 100과 30을 대입한 알고리즘)
수행 1일차 (3/6 화)

강의시간에 4,5명씩 조를 구성함. 조원들 각각의 포지션을 정하고,
기본적인 과제에 대한 이해를 위해 각자 주제(파스칼삼각형)에 대하
여 연구하기로함. 다음 강의시간이 되기전에 조원끼리 모여 과제에
대하여 미리 토의 하고, 종합해 보기로 함.




수행 2일차 (3/8 목)

개인별로 과제에 대하여 연구를 하고, 기본적인 알고리즘을 제시하
여, 가장 기본이 되는 소스를 만들었음. 소스는 주어진 조건을 만족
하는 모든 값(n=1000)을 연산하고, 그 값 P(n,m)을 입력하여 해당
값을 출력하는 구조로 만들었음. 하지만 그 값을 출력하는데 많은
시간과 메모리를 차지하는 프로그램임. 이 소스를 간단히 하기위해
장동규가 수정을 하였는데, n=1000값을 모두 연산하지않고, 주어지
는 n값 만큼만 연산하여 출력하도록 하였음. 그 결과 연산에 들어가
는 시간이 많이 줄어들었음.
#include <stdio.h>
                                              int ar[1000][1000];
#include <stdio.h>                            int n,m;
                                              void main()
int ar[1000][1000];
                                              {
int n,m;
                                                int i,j;
                                                scanf("%d%d",&n,&m);
void main()                                     if(n>=1)
{                                               {
 int i,j;                                         ar[1][1]=1;
 ar[1][1]=1;                                      for(i=1;i<=n;i++)
                                                  {
    for(i=1;i<=1000;i++)
                                                    ar[i][1]=1;
    {
                                                    for(j=2;j<n;j++)
        ar[i][1]=1;
                                                    {



                                    ≫
        printf("%u ",ar[i][1]);
        for(j=2;j<=1000;j++)                  ar[i][j]=ar[i-1][j-1]+ar[i-1][j];
        {                                           }
                                                    ar[i][i]=1;
ar[i][j]=ar[i-1][j-1]+ar[i-1][j];                 }
                                                }
printf("%u ",ar[i][j]);
                                                for(i=1;i<=n;i++)
        }                                       {
        printf("n");                             for(j=1;j<=i;j++)
    }                                             {
 printf("p(n,m)?");                                 printf("%u ",ar[i][j]);
 scanf("%d%d",&n,&m);                             }
                                                  printf("n");
 printf("P(n,m) = %u",ar[n][m]);
                                                }
}
                                                printf("P(n,m)? %u",ar[n][m]);
                                                return 0;
                                              }



                        (n=1000값을 연산하는 부분을 제거하고, n만큼의 값만 받아서 연산하도록 수정.)
수행 3일차 (3/10 토)
장소 : 메신저를 통하여 인터넷 회의
※ 개선점

소스를 분석한 결과 1행에서는 1열만 연산하면 되는데, n열까지 불필요하게 연산는 과정
이 있음. 김도형이 구조를 다시 한번 개선하여 행의 증가한 수만큼 열을 계산하도록 하여
연산횟수를 줄이는 것으로 수정. 그리고 소스의 불필요한 비교문이나 연산문들이 있는 부
분도 제거함.
#include <stdio.h>                      #include <stdio.h>
int ar[1000][1000];                     int ar[1000][1000];
int n,m;                                int n,m;
void main()
                                        void main()
{
                                        {
  int i,j;
  scanf("%d%d",&n,&m);                   int i,j;
  if(n>=1)                               scanf("%d%d",&n,&m);
  {                                         ar[1][1]=1;
    ar[1][1]=1;                             for(i=2;i<=n;i++)
    for(i=1;i<=n;i++)                       {
    {
                                             ar[i][1]=1;
      ar[i][1]=1;
                                             for(j=2;j<=i;j++)
      for(j=2;j<n;j++)




                                    ≫
      {                                      {


ar[i][j]=ar[i-1][j-1]+ar[i-1][j];       ar[i][j]=ar[i-1][j-1]+ar[i-1][j];
      }                                      }
      ar[i][i]=1;                           }
    }
                                         for(i=1;i<=n;i++)
  }
                                         {
  for(i=1;i<=n;i++)
  {                                         for(j=1;j<=i;j++)
    for(j=1;j<=i;j++)                       {
    {                                        printf("%u ",ar[i][j]);
      printf("%d ",ar[i][j]);               }
    }                                       printf("n");
    printf("n");
                                         }
  }
                                         printf("P(n,m)? %u",ar[n][m]);
  printf("P(n,m)? %d",ar[n][m]);
  return 0;                             }
}
                                                 *빨간색 : 제거부분     *초록색 : 개선부분
                (위 표를 보면 어떠한 부분이 제거 되었고 어떠한 부분이 바뀌었는지 잘 알 수 있다.)
※ 발견된 문제점
출력결과 ///////////////
//////////////////
///////////////
이렇듯 int형인 경우 변수에 저장된 값이 21억이 넘으면 값이 -로 나오면서
값이 잘려버리는 문제점이 발생함. 이에 대해서는 다음 모임까지 조사해오기
로 함.


수행 4일차 (3/13 화)

값이 잘리는 문제점에 대하여 여러 가지 방안들이 나옴.
① 변수형 __int64 쓰는방법.
② 변수형 int 앞에 long를 붙혀 자료형의 크기를 늘여주는 방법.
③ 출력할 때 %d 가 아닌 %u를 쓰는 방법.
④ 변수형을 double 형으로 바꿔주는 방법.
 #include <stdio.h>                                  #include <stdio.h>
 __int64 ar[1000][1000];                             double ar[1000][1000];
 int n,m;                                            int n,m;

 void main()
                                                     void main()
 {
     int i,j;                                        {
     scanf("%d%d",&n,&m);                             int i,j;
      ar[1][1]=1;                                     scanf("%d%d",&n,&m);
      for(i=2;i<=n;i++)                                  ar[1][1]=1;
      {                                                  for(i=2;i<=n;i++)




                                                 ≫
         ar[i][1]=1;                                     {
         for(j=2;j<=i;j++)
                                                          ar[i][1]=1;
         {
                                                          for(j=2;j<=i;j++)
             ar[i][j]=ar[i-1][j-1]+ar[i-1][j];
         }                                                {
      }                                                      ar[i][j]=ar[i-1][j-1]+ar[i-1][j];
     for(i=1;i<=n;i++)                                    }
     {                                                   }
      for(j=1;j<=i;j++)                               printf("P(n,m)? %.0lf",ar[n][m]);
      {                                              }
         printf("%.0lf ",ar[i][j]);
      }
      printf("n");
     }
     printf("P(n,m)? %I64d",ar[n][m]);
 }
개선결과

① 변수형 __int64 쓰는방법 :
 -이 경우에는 재대로된 값이 좀더 많이 나오기는 했지만 좀더 n의 값을 높
이면 -값이 출력되어 값이 깨져버림.




② 변수형 int 앞에 long를 붙혀 자료형의 크기를 늘여주는 방법
 -이 경우는 1번과 결과가 거의 동일하였다.




③ 출력할 때 %d 가 아닌 %u를 쓰는 방법
 -값이 출력되지는 않았지만 10의 10승 이상 값이 커지면 증가하지 못하였
  다.




④ 변수형을 double 형으로 바꿔주는 방법.
 -아주 큰 숫자까지 출력이 되었지만 이경우에도 뒷자리가 0으로 변하는 문
  제가 발생하였다
수행 5일차 (3/15 목)
//최종소스
#include <stdio.h>
double ar[1000][1000];
double Pas(int n,int m)
{
 int i,j;
 ar[1][1]=1;
 for(i=2;i<=n;i++)
 {
     ar[i][1]=1;
     for(j=2;j<=i;j++)
     {
      ar[i][j]=ar[i-1][j-1]+ar[i-1][j];
     }
 }
 return ar[n][m];
}
void main()
{
int n,m;
double r;
scanf("%d%d",&n,&m);
r= Pas(n,m);
printf("%.0lfn", r);
}


결과 값을 재대로 내기위하여 조합 계산(nCr) 공식을 사용하여 값을 구하려 했
으나 1000!을 계산할 경우에도 값의 오류가 나서 변수형의 크기를 커지게 하
는 방법 외에는 방법이 없다. 라는 결론이 나왔습니다.
시간복잡도 계산에 관하여

시간복잡도(Time complexity), 공간복잡도(Space complexity)
시간복잡도. 알고리즘을 실행하여 종료할 때까지의 필요한 시간
시간 복잡도는 알고리즘을 구성하는 명령어들이 몇 번이나 실행이 되는지를 센 결과(frequency count)에 각 명령어
의 실행시간(execution time)을 곱한 합계를 의미한다. 그러나 각 명령어의 실행시간은 특정 하드웨어 혹은 프로그
래밍 언어에 따라서 그 값이 달라질 수 있기 때문에 알고리즘의 일반적인 시간 복잡도는 명령어의 실제 실행시간을
제외한 명령어의 실행 횟수만을 고려하게 된다.
공간복잡도. 알고리즘을 실행하여 종료할 때까지의 필요한 메모리의 크기
주어진 알고리즘을 실행시키기 위해 필요한 기억장치(space)는 다음과 같이 두
가지로 분류해 볼 수 있다.

1.알고리즘과 무관한 부분             : 알고리즘의 특성과는 무관한 부분으로 프로그램
코드를 저장하기 위한 공간, 프로그램을 수행하기
위해 시스템이 필요로 하는 공간 등이 이에
포함된다.

2.알고리즘과 밀접한 부분             : 알고리즘의 특성과 밀접한 관계가 있는 부분으로서
문제를 해결하기 위해 필요로 하는 공간을 의미한다.
즉, 변수를 저장하기 위한 공간이나 순환 프로그램일
경우 순환 스택(recursion stack) 등이 이에
포함된다.
일반적으로 알고리즘의 공간 복잡도를 분석할때는 위의 두가지중 두 번째의 것을 계산하게 된다. 즉, 알고리즘이 문
제를 해결하기 위해서 반드시 필요한 부분만을 계산함으로써 주어진 알고리즘의 공간 복잡도를 계산한다.




2일차 소스 시간,공간복잡도                       3일차 이후 소스 시간,공간복잡도
과제를 마치면서....
- C언어 공부에 대한 부족함을 많이 느꼈습니다. 아주 큰 숫자를 담아 연산하는 방법을 알았더라면 좀 더
신뢰성이 높은 완벽한 프로그램을 짤 수 있었을 것 같습니다.

More Related Content

What's hot

이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4pkok15
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서KimChangHoen
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdfkd19h
 
이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서KimChangHoen
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array웅식 전
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning IntegrationTIMEGATE
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfkd19h
 
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출동윤 이
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer웅식 전
 
함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게Gyooha Kim
 
목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동Hyosung Jeon
 
자료구조 01 최종 보고서
자료구조 01 최종 보고서자료구조 01 최종 보고서
자료구조 01 최종 보고서pkok15
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형Kimjeongmoo
 

What's hot (18)

이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4이산수학 C1 프로젝트 4
이산수학 C1 프로젝트 4
 
이산수학04
이산수학04이산수학04
이산수학04
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
자구2번
자구2번자구2번
자구2번
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
이산치4보고서
이산치4보고서이산치4보고서
이산치4보고서
 
2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf2012 Ds B2 02 Pdf
2012 Ds B2 02 Pdf
 
이산치7보고서
이산치7보고서이산치7보고서
이산치7보고서
 
12 1. multi-dimensional array
12 1. multi-dimensional array12 1. multi-dimensional array
12 1. multi-dimensional array
 
스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration스플렁크 Machine Learning Integration
스플렁크 Machine Learning Integration
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
 
11. array & pointer
11. array & pointer11. array & pointer
11. array & pointer
 
함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게함수형 프로그래밍? 그래서 어떻게
함수형 프로그래밍? 그래서 어떻게
 
목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동목적이 부여된 에이전트 행동
목적이 부여된 에이전트 행동
 
자료구조 01 최종 보고서
자료구조 01 최종 보고서자료구조 01 최종 보고서
자료구조 01 최종 보고서
 
Project#1파스칼 삼각형
Project#1파스칼 삼각형Project#1파스칼 삼각형
Project#1파스칼 삼각형
 
R_datamining
R_dataminingR_datamining
R_datamining
 

Similar to 2012 Ds D0 01

이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5pkok15
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfjinwookhong
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfjinwookhong
 
이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3pkok15
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3mil23
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기herojoon1378
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpKimjeongmoo
 
2012 Dm C2 05
2012 Dm C2 052012 Dm C2 05
2012 Dm C2 05seonhyung
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02chl132435
 
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조영기 김
 
Project#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpProject#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpKimjeongmoo
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 WinterSuhyun Park
 

Similar to 2012 Ds D0 01 (20)

자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5이산수학 C1 프로젝트 5
이산수학 C1 프로젝트 5
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
이산치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 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
 
이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3이산수학 C1 프로젝트 3
이산수학 C1 프로젝트 3
 
이산수학03
이산수학03이산수학03
이산수학03
 
이산치1번
이산치1번이산치1번
이산치1번
 
과제 1,2,3
과제 1,2,3과제 1,2,3
과제 1,2,3
 
5통신망에서 길 찾기
5통신망에서 길 찾기5통신망에서 길 찾기
5통신망에서 길 찾기
 
Project#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 HwpProject#5 통신망에서 길 찾기 Hwp
Project#5 통신망에서 길 찾기 Hwp
 
2012 Dm C2 05
2012 Dm C2 052012 Dm C2 05
2012 Dm C2 05
 
2012 Ds B2 02
2012 Ds B2 022012 Ds B2 02
2012 Ds B2 02
 
알고리즘과 자료구조
알고리즘과 자료구조알고리즘과 자료구조
알고리즘과 자료구조
 
3콤비네이션
3콤비네이션3콤비네이션
3콤비네이션
 
Project#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort HwpProject#3 How Fast Can We Sort Hwp
Project#3 How Fast Can We Sort Hwp
 
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
퍼시스턴트 세그먼트 트리 - Sogang ICPC Team, 2020 Winter
 

2012 Ds D0 01

  • 1. 팀 명 D0 조원 profile 20093447 : 김도형 20113311 : 장동규 20093489 : 송하윤 20113324 : 최수영
  • 2. 과 제 수 행 일 지 이름: 20소속 : 자료구조 01분반 D0조 093447 김도형 ,20093489 송하윤 ,20113324 최수영 ,20113311 장동규 과제수행기간: 14일 5번 모임 총 10시간 I. 계획의 작성 ①연구제목: 파스칼의 삼각형 ②연구배경: Array에 대한 이해 ③참고자료: Fundamentals of Data Structures in C 구글검색 , 책(열혈강의 C프로그래밍) 시간 공간 복잡도 참고: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68494777&qb =U3BhY2UgY29tcGxleGl0eQ==&enc=utf8&section=kin&rank=3&search_sort=0&sp q=0 II. 목차 - 임무분담에 대하여 ( 3쪽 ) - 알고리즘 순서도 ( 4쪽 ) - 계획의 실행 ( 5~10쪽 ) - 시간,공간 복잡도의 계산 ( 11쪽 ) - 과제를 마치면서( 마지막 쪽 )
  • 3. ※ 임무 분담에 대하여 조장 : 김도형 보고서 작성, 최종 종합, 프로그램 설명서. 알고리즘 : 장동규 자연식의 계산 원리를 파악하여 프로그램에 대입하는 역할. 코딩 : 김도형 프로그램에 대하여 구조 개선 및 문제점 해결. 자료검토 및 스케줄 : 송하윤 토론 계획 및 스케줄 관리 준비된 자료 재검토. 검색 및 토의종합 : 최수영 토의 한 내용 기록 및 문제 및 궁금점 조사.
  • 4. ● 알고리즘 순서도 (n과 m에 대해서는 임의의 숫자 100과 30을 대입한 알고리즘)
  • 5. 수행 1일차 (3/6 화) 강의시간에 4,5명씩 조를 구성함. 조원들 각각의 포지션을 정하고, 기본적인 과제에 대한 이해를 위해 각자 주제(파스칼삼각형)에 대하 여 연구하기로함. 다음 강의시간이 되기전에 조원끼리 모여 과제에 대하여 미리 토의 하고, 종합해 보기로 함. 수행 2일차 (3/8 목) 개인별로 과제에 대하여 연구를 하고, 기본적인 알고리즘을 제시하 여, 가장 기본이 되는 소스를 만들었음. 소스는 주어진 조건을 만족 하는 모든 값(n=1000)을 연산하고, 그 값 P(n,m)을 입력하여 해당 값을 출력하는 구조로 만들었음. 하지만 그 값을 출력하는데 많은 시간과 메모리를 차지하는 프로그램임. 이 소스를 간단히 하기위해 장동규가 수정을 하였는데, n=1000값을 모두 연산하지않고, 주어지 는 n값 만큼만 연산하여 출력하도록 하였음. 그 결과 연산에 들어가 는 시간이 많이 줄어들었음.
  • 6. #include <stdio.h> int ar[1000][1000]; #include <stdio.h> int n,m; void main() int ar[1000][1000]; { int n,m; int i,j; scanf("%d%d",&n,&m); void main() if(n>=1) { { int i,j; ar[1][1]=1; ar[1][1]=1; for(i=1;i<=n;i++) { for(i=1;i<=1000;i++) ar[i][1]=1; { for(j=2;j<n;j++) ar[i][1]=1; { ≫ printf("%u ",ar[i][1]); for(j=2;j<=1000;j++) ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; { } ar[i][i]=1; ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; } } printf("%u ",ar[i][j]); for(i=1;i<=n;i++) } { printf("n"); for(j=1;j<=i;j++) } { printf("p(n,m)?"); printf("%u ",ar[i][j]); scanf("%d%d",&n,&m); } printf("n"); printf("P(n,m) = %u",ar[n][m]); } } printf("P(n,m)? %u",ar[n][m]); return 0; } (n=1000값을 연산하는 부분을 제거하고, n만큼의 값만 받아서 연산하도록 수정.)
  • 7. 수행 3일차 (3/10 토) 장소 : 메신저를 통하여 인터넷 회의 ※ 개선점 소스를 분석한 결과 1행에서는 1열만 연산하면 되는데, n열까지 불필요하게 연산는 과정 이 있음. 김도형이 구조를 다시 한번 개선하여 행의 증가한 수만큼 열을 계산하도록 하여 연산횟수를 줄이는 것으로 수정. 그리고 소스의 불필요한 비교문이나 연산문들이 있는 부 분도 제거함. #include <stdio.h> #include <stdio.h> int ar[1000][1000]; int ar[1000][1000]; int n,m; int n,m; void main() void main() { { int i,j; scanf("%d%d",&n,&m); int i,j; if(n>=1) scanf("%d%d",&n,&m); { ar[1][1]=1; ar[1][1]=1; for(i=2;i<=n;i++) for(i=1;i<=n;i++) { { ar[i][1]=1; ar[i][1]=1; for(j=2;j<=i;j++) for(j=2;j<n;j++) ≫ { { ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; } } ar[i][i]=1; } } for(i=1;i<=n;i++) } { for(i=1;i<=n;i++) { for(j=1;j<=i;j++) for(j=1;j<=i;j++) { { printf("%u ",ar[i][j]); printf("%d ",ar[i][j]); } } printf("n"); printf("n"); } } printf("P(n,m)? %u",ar[n][m]); printf("P(n,m)? %d",ar[n][m]); return 0; } } *빨간색 : 제거부분 *초록색 : 개선부분 (위 표를 보면 어떠한 부분이 제거 되었고 어떠한 부분이 바뀌었는지 잘 알 수 있다.)
  • 8. ※ 발견된 문제점 출력결과 /////////////// ////////////////// /////////////// 이렇듯 int형인 경우 변수에 저장된 값이 21억이 넘으면 값이 -로 나오면서 값이 잘려버리는 문제점이 발생함. 이에 대해서는 다음 모임까지 조사해오기 로 함. 수행 4일차 (3/13 화) 값이 잘리는 문제점에 대하여 여러 가지 방안들이 나옴. ① 변수형 __int64 쓰는방법. ② 변수형 int 앞에 long를 붙혀 자료형의 크기를 늘여주는 방법. ③ 출력할 때 %d 가 아닌 %u를 쓰는 방법. ④ 변수형을 double 형으로 바꿔주는 방법. #include <stdio.h> #include <stdio.h> __int64 ar[1000][1000]; double ar[1000][1000]; int n,m; int n,m; void main() void main() { int i,j; { scanf("%d%d",&n,&m); int i,j; ar[1][1]=1; scanf("%d%d",&n,&m); for(i=2;i<=n;i++) ar[1][1]=1; { for(i=2;i<=n;i++) ≫ ar[i][1]=1; { for(j=2;j<=i;j++) ar[i][1]=1; { for(j=2;j<=i;j++) ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; } { } ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; for(i=1;i<=n;i++) } { } for(j=1;j<=i;j++) printf("P(n,m)? %.0lf",ar[n][m]); { } printf("%.0lf ",ar[i][j]); } printf("n"); } printf("P(n,m)? %I64d",ar[n][m]); }
  • 9. 개선결과 ① 변수형 __int64 쓰는방법 : -이 경우에는 재대로된 값이 좀더 많이 나오기는 했지만 좀더 n의 값을 높 이면 -값이 출력되어 값이 깨져버림. ② 변수형 int 앞에 long를 붙혀 자료형의 크기를 늘여주는 방법 -이 경우는 1번과 결과가 거의 동일하였다. ③ 출력할 때 %d 가 아닌 %u를 쓰는 방법 -값이 출력되지는 않았지만 10의 10승 이상 값이 커지면 증가하지 못하였 다. ④ 변수형을 double 형으로 바꿔주는 방법. -아주 큰 숫자까지 출력이 되었지만 이경우에도 뒷자리가 0으로 변하는 문 제가 발생하였다
  • 10. 수행 5일차 (3/15 목) //최종소스 #include <stdio.h> double ar[1000][1000]; double Pas(int n,int m) { int i,j; ar[1][1]=1; for(i=2;i<=n;i++) { ar[i][1]=1; for(j=2;j<=i;j++) { ar[i][j]=ar[i-1][j-1]+ar[i-1][j]; } } return ar[n][m]; } void main() { int n,m; double r; scanf("%d%d",&n,&m); r= Pas(n,m); printf("%.0lfn", r); } 결과 값을 재대로 내기위하여 조합 계산(nCr) 공식을 사용하여 값을 구하려 했 으나 1000!을 계산할 경우에도 값의 오류가 나서 변수형의 크기를 커지게 하 는 방법 외에는 방법이 없다. 라는 결론이 나왔습니다.
  • 11. 시간복잡도 계산에 관하여 시간복잡도(Time complexity), 공간복잡도(Space complexity) 시간복잡도. 알고리즘을 실행하여 종료할 때까지의 필요한 시간 시간 복잡도는 알고리즘을 구성하는 명령어들이 몇 번이나 실행이 되는지를 센 결과(frequency count)에 각 명령어 의 실행시간(execution time)을 곱한 합계를 의미한다. 그러나 각 명령어의 실행시간은 특정 하드웨어 혹은 프로그 래밍 언어에 따라서 그 값이 달라질 수 있기 때문에 알고리즘의 일반적인 시간 복잡도는 명령어의 실제 실행시간을 제외한 명령어의 실행 횟수만을 고려하게 된다. 공간복잡도. 알고리즘을 실행하여 종료할 때까지의 필요한 메모리의 크기 주어진 알고리즘을 실행시키기 위해 필요한 기억장치(space)는 다음과 같이 두 가지로 분류해 볼 수 있다. 1.알고리즘과 무관한 부분 : 알고리즘의 특성과는 무관한 부분으로 프로그램 코드를 저장하기 위한 공간, 프로그램을 수행하기 위해 시스템이 필요로 하는 공간 등이 이에 포함된다. 2.알고리즘과 밀접한 부분 : 알고리즘의 특성과 밀접한 관계가 있는 부분으로서 문제를 해결하기 위해 필요로 하는 공간을 의미한다. 즉, 변수를 저장하기 위한 공간이나 순환 프로그램일 경우 순환 스택(recursion stack) 등이 이에 포함된다. 일반적으로 알고리즘의 공간 복잡도를 분석할때는 위의 두가지중 두 번째의 것을 계산하게 된다. 즉, 알고리즘이 문 제를 해결하기 위해서 반드시 필요한 부분만을 계산함으로써 주어진 알고리즘의 공간 복잡도를 계산한다. 2일차 소스 시간,공간복잡도 3일차 이후 소스 시간,공간복잡도
  • 12. 과제를 마치면서.... - C언어 공부에 대한 부족함을 많이 느꼈습니다. 아주 큰 숫자를 담아 연산하는 방법을 알았더라면 좀 더 신뢰성이 높은 완벽한 프로그램을 짤 수 있었을 것 같습니다.