2012 ds 01

25
project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 #1 project #1 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 파스칼의 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 삼각형 파스칼의 삼각형 자료구조 D1 조장: 20083438 김무경 조원: 20093452 김시백 20093460 김정훈 20113318 정예린 20113319 정진아

Upload: jungyerin

Post on 12-Jun-2015

328 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 2012 Ds 01

project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project project #1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1project #1

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

자료구조 D1

조장: 20083438 김무경

조원: 20093452 김시백

20093460 김정훈

20113318 정예린

20113319 정진아

Page 2: 2012 Ds 01

순 서

1. 프로젝트 설명

2. 프로젝트 전체일정

2-1. 회의록

3. 업무분담

3-1. 업무분담 개인보고

4. 초안

5. 문제점

6. 해결책

7. 결과분석

Page 3: 2012 Ds 01

1. 프로젝트 설명

파스칼의 삼각형이란?

1) 파스칼 삼각형

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

2)이항계수

···

Page 4: 2012 Ds 01

파스칼의 삼각형은 수학에서 이항계수를 삼각형 모양의 기하학적 형태로

배열한 것이다. 이것은 블레즈 파스칼에 의해 이름 붙여졌으나 이미 수세기

전에 다른 사람들에게서 연구된 것이다.

단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다.

1. 먼저 첫 번째 줄에는 숫자 1을 쓴다.

1. 그 다음 줄을 만들려면, 바로 위의 왼쪽 숫자와 오른쪽 숫자를 더한

다. 예를 들어, 네 번째 줄의 숫자 1과 3을 더하여 다섯 번째 줄의 4

가 만들어진다.

수학적으로, 이 구조는 파스칼의 법칙을 사용하여 아래와 같이 표현한다. n

번째 줄의 k 번째 값을 라고 하면, 이 값은

으로 정의된다. 이때,

라는 성질에 의해

가 성립한다. 즉, n 번째 열의 k 번째 값은 과 같은 값을 가진다.

파스칼의 삼각형은 더 높은 차원으로 확장하여 일반화할 수 있다. 3차원 형태

는 파스칼의 피라미드 또는 파스칼의 4면체로 부른다. 더 높은 차원의 유사체

를 일반적으로 총칭하여 "파스칼의 단체"라고 일컫는다. 피라미드, 사면체,

단체(單體)를 참조하라.

파스칼의 삼각형의 응용

파스칼의 삼각형은 이항 전개에서 계수들의 값을 계산하는 데에 사용된다. 예

를 들어

라는 식에서, 각 계수의 값인 1, 2, 1은 파스칼의 삼각형의 3번째 줄에 대응

Page 5: 2012 Ds 01

된다.

일반적으로,

와 같은 전개식에서, 가 성립한다. 즉, 는 파스칼의 삼각형의

(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. 시간공간 복잡도를 조금이라도 줄이는 대책

Page 6: 2012 Ds 01

2.프로젝트 전체일정

기 간 12. 03. 08 ~ 12. 03. 13 ~ 12. 03. 15

내 용- 조원별 업무 분담

및 계획 작성

-알고리즘에 대한 구체적인 계획 및 자료 정리

-알고리즘에 대한 서로의 의견 나누기

- 알고리즘을 기본으로 한 코딩 작업

- 코딩 결과에 대한 문제점 파악과 해결방안 제시

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

내 용

- 해결방안의 적용과 최종 검토

- 최종보고서 작성

- 검토과정에서 발견된

문제점파악 및 해결

- 최종보고서의 자료 보충

- 최종보고서 검토 및 제출

Page 7: 2012 Ds 01

2-1. 회의록

자료구조 01분반 D1: #1 파스칼의 삼각형

일 시 2012년 3월 8일 (목)4시 30분부터6시 00분까지

장 소 55110 소집 및 발안자

●회의 내용

*문제에 대한 파악

- 파스칼의 삼각형을 행과 열을 입력 받아 그 자리의 값을 출력하는 프로그램을 배열을 사용하여 c언어로 구현하라. - 시간 복잡도와 공간 복잡도를 최대한 줄여서 효율적으로 프로그램을 구현하라.

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

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

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

업무의 종류

- 문제에 필요한 자료 검색- 알고리즘 짜오기- 알고리즘을 기반으로 한 c언어 소스 구현- 시간 복잡도와 공간 복잡도 계산- 문제점 파악 및 보완- 보고서 작성

Page 8: 2012 Ds 01

일 시 2012년 3월 13일 (화)3시 00분부터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)인 규칙에 따라 값을 저장하도록 한다.

⑾ 배열에 파스칼의 삼각형을 위와 같은 원리로 저장, 자리값을 입력받아 값

을 출력한다.

Page 9: 2012 Ds 01

일 시 2012년 3월 15일 (목)4시 30분부터6시 00분까지

장 소 55110 소집 및 발안자

●회의 내용

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

*소스구현에 대한 문제점 파악-소스를 실행시켜보고 과제와 비교하고 토의를 통해

문제점을 파악할 수 있었음.

-공간이 작아서 1000*1000배열의 숫자를 모두 담지 못함

-큰 값이 존재하므로 overflow가 일어나 값이 출력이 되지 않음

-이차원배열로 인해 공간복잡도가 큼

-이중포문으로 인해 시간복잡도가 큼

*문제점 해결방안

-문자열로 입력받아 다시 숫자로 바꾸기

-이항정리식을 이용하여 프로그램을 작성

-공간을 없애기 위해서

⑴파스칼의 삼각형에서 위의 행을 이용하여 다음행을 구하는 원리를 이용.

⑵위의 행을 이용하여 다음 행을 저장함.

⑶필요한 맨 마지막 행만 남겨놓고 위의 두 행을 초기화.

⑷남겨놓았던 맨 마지막 행을 다시 첫 행으로 자리를 옮김.

⑸이 과정을 반복하여 결과 값이 필요한 행까지만 배열의 칸을 사용함.

이 알고리즘을 통해 극복 되는 문제점

-1000*1000의 배열→3*1000개의 배열로 수정이 되므로 공간복잡도가 줄어들게 됨.

Page 10: 2012 Ds 01

일 시 2012년 3월 17일 (토)10시 00분부터14시 00분까지

장 소 50호관 소집 및 발안자

●회의 내용

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

*최종보고서 작성

Page 11: 2012 Ds 01

이 름 업 무

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

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

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

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

정진아시간복잡도와 공간복잡도에 대한 계산방법과 정의 설

명 및 계산

3.업무분담

Page 12: 2012 Ds 01

3-1.업무분담 개인보고

김무경

전체적인 보고서 틀을 구상하여 보고서 작성

회의진행

필요한 학습내용 숙지

-배열의사용

type 배열명[크기][크기]...;

type은 어떤 타입의 변수들이 모여 있는지를 지정하는데 정수형 변수들의 모임이면

int, 실수형 변수들의 모임이면 double이라고 적는다. 기본형 외에도 포인터, 구조체,

사용자 정의형 등 임의의 타입이 모두 배열을 구성할 수 있다. 타입 T가 있으면 T

형 배열은 언제나 가능하며 심지어 배열의 배열도 선언할 수 있다.

배열명은 말 그대로 배열의 이름이다. 배열명도 명칭이므로 명칭 규칙에 맞게만 작

성하면 된다. 관습적으로 배열명에는 ar이나 a같은 접두어를 붙여 이 변수가 배열이

라는 것을 쉽게 알 수 있도록 한다. 점수들의 배열이라면 arScore, 사람 이름의 배

열이라면 arName, 좌표의 배열이라면 arPos 등으로 이름을 붙인다.

크기는 이 배열이 몇 개의 요소를 가지는지, 즉 몇 개의 변수가 모여서 배열을 구

성하는지를 지정하는데 자연수로 된 상수를 적어 준다. 개수이기 때문에 음수나 실

수는 당연히 안되며 선언할 때 필요한 메모리양을 계산할 수 있어야 하므로 반드시

상수만 쓸 수 있다. 배열의 차원만큼 크기를 지정하되 2차원 배열이면 [ ] 괄호를

두 번 써 준다.

출처 : http://www.winapi.co.kr/

-시간복잡도

프로그램 P에 의해 소요되는 시간 T(P)는 컴파일 시간과 실행시간을 합한 것이다.

컴파일 시간은 인스턴스 특성에 의존하지 않기 때문에 고정 공간 요구와 유사하다

또한 프로그램이 일단 정확히 수행된다는 것이 검증되면, 그 프로그램을 다시 컴파

일하지 않고도 여러 번 수행할 수 있다. 그렇기 때문에 프로그램의 실행 시간만 염

두에 두면 된다.

Page 13: 2012 Ds 01

-공간복잡도

프로그램이 필요로 하는공간

고정공간과 가변공간의 합이다. 프로그램의 공간복잡도를 분석할 때는 보통

가변공간 요구에 대해서만 관심을 둔다. 이것은 특히 여러 프로그램의 공간

복잡도를 비교하려 할 때 유효하다.

출처 : 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. 배열에 파스칼의 삼각형을 위와 같은 원리로 저장한 후 원하는 자리를 입

력받아 값을 출력한다.

Page 14: 2012 Ds 01
Page 15: 2012 Ds 01

정예린, 정진아

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

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

#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;

Page 16: 2012 Ds 01

}

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

보통은 알고리즘의 효율성을 판단하는 기준은

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");

}

Page 17: 2012 Ds 01

이 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차원 이상의 함수도 도출이 가능합니다.

Page 18: 2012 Ds 01

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는 열

{

Page 19: 2012 Ds 01

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;

}

Page 20: 2012 Ds 01

5.문제점1.

1000*1000 이하의 숫자를 입력받는 과제인데

1000*1000개의 배열을 선언 할 수 없음

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

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

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

3. 공간복잡도가 지나치게 큼

-int가 4바이트이므로 1000x1000배열을 선언했을 때

공간복잡도는 4x1000x1000이 되므로 너무 크다.

Page 21: 2012 Ds 01

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);

Page 22: 2012 Ds 01

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개의 배열로 수정이 되므로 공간복잡도가

줄어들게 됨.

Page 23: 2012 Ds 01

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

Page 24: 2012 Ds 01
Page 25: 2012 Ds 01