E D R , A S I H C RSS

Pascal Triangle

ŒŒŠคนผ˜ ‚ผ๊ฐ˜• •Œ๊ณ ๋ฆฌฆ˜

  • ๋ฉฐน  „— ๋งˆ๊ฐ๋œ ž๋ฃŒ๊ตฌกฐ˜ ฒซ๋ฒˆงธ ˆ™ œ˜€ฃ ? ๋‹ค๋ฅธ ๋ถ„๋“ค๋„ ๋‹ค๋ฅด๊ฒŒ งœ‹  ๋ถ„ด žˆœผ‹œ๋‹ค๋ฉด „œ๋กœ ˜๊ฒฌ„ ๋‚˜๋ˆ  ๋ณด•˜œผ๋ฉด •ฉ๋‹ˆ๋‹ค.

žฌ๊ท€ ˜ธถœ„ ดšฉ•œ ๋ฐฉ๋ฒ• - by ธˆ˜

~cpp 
const int pas(const int &m,const int &n)
{
    if(m==n || n==1) // –‰๊ณผ —ดด ๊ฐ™๊ฐ๋‚˜(๊ฐ€žฅ ˜ค๋ฅธชฝด๊ฐ๋‚˜) —ดด 1ผ๋•Œ๋Š” 1ถœ๋ ฅ
        return 1;
    else
        return pas(m-1,n-1)+pas(m-1,n); // žฌ๊ท€˜ธถœ
}

  • ๋ณด‹œ๋Š” ๋ฐ”™€ ๊ฐ™ด.. กธ๋ผ ๊ฐ„๋‹จ•ฉ๋‹ˆ๋‹ค.
  • but.. ˆž๊ฐ€ กฐ๊ธˆ๋งŒ ปค ธ๋„.. ๊ต‰žฅžˆ ˜ค๋ž˜ ๊ธ๋ฆฝ๋‹ˆ๋‹ค. 01•™๋ฒˆ ด„ ˜ธ๊ตฐด 32–‰  •๋„๋ฅผ ๋„–ด๋ดค„๋•Œ ๊ธ๋ฆฐ ‹œ๊ฐ„€ 100ˆ๊ฐ€ ๋„˜—ˆ๋‹ค •ฉ๋‹ˆ๋‹ค. žฌ๊ท€˜ธถœ.. ๋ ˆ˜ žˆœผ๋ฉด “ฐง€ ๋ง™‹œ๋‹ค.
  • ด •Œ๊ณ ๋ฆฌฆ˜€ ‹œ๊ฐ„„ ฌƒ•˜๋ฉด„œ ๊ณต๊ฐ„„ „ธ •Œ๊ณ ๋ฆฌฆ˜ด๊ฒ ฃ ?
  • ๋’ค๋ฅผ ๋ณผ๊ฒƒ๋„ —†ด ผ๊ด€ ธ •Œ๊ณ ๋ฆฌฆ˜ -- „ ˜ธ.

recursive -zennith

~cpp 
unsigned long int P(int row, int col) {
	/* —ด˜ ๊ฐ’ด –‰๋ณด๋‹ค ด ๊ฒฝšฐ ข…๋ฃŒ */
	if(row < col)
		exit(0);

	/* ฃผ–ด„ ๊ฐ’„ ๊ฒ€‚ฌ•˜—ฌ, ฒซ๋ฒˆงธ —ดด 1ด๊ฐ๋‚˜ –‰๊ณผ —ดด ๊ฐ™€๊ฒฝšฐ 1„ ๋ฆฌ„ด */
	if(col == 1 || row == col)
		return 1;

	/* ๊ทธ๋ ‡ง€ •Š€ ๊ฒฝšฐ –‰๊ณผ —ด„ 1”ฉ ๊ฐ†Œ•ด„œ žฌ๊ท€ ˜ธถœ•œ ๊ฐ’๊ณผ
	–‰๋งŒ 1 ๊ฐ†Œ‹œผœ žฌ๊ท€ ˜ธถœ•œ ๊ฐ’„ ๋”•ด„œ ๋ฆฌ„ด */
	return P(--row, --col) + P(row, ++col);
}

  • ๋‹จˆœžˆ ”„๋ฆฐŠธ๋ฌผ˜ ๋‚ดšฉ„ ˜ฎ๊ฒผ„ ๋ฟ..

๋™  ๋ฐฐ—ด„ ดšฉ•œ ๋ฐฉ๋ฒ• - by ธˆ˜

~cpp 
typedef unsigned long ulong;

ulong Pascal_Triangle(int m,int n)
{
	ulong **Array=new ulong*[m];	// 2ฐจ› ๋™  ๋ฐฐ—ด • ๋‹น

	for(int i=0;i<m;i++)
		Array[i]=new ulong[i+1];	// n–‰—๋Š” n๊ฐœ˜ —ด๋งŒ • ๋‹น๋˜๊ฒŒ

	for(i=0;i<m;i++)
	{
		for(int j=0;j<=i;j++)
		{
			if(i==j || j==0)		// –‰๊ณผ —ดด ๊ฐ™๊ฐ๋‚˜ —ดด 1ผ๋•Œ
				Array[i][j]=1;		// (๋ฐฐ—ด€ 0๋ถ€„‹œž‘•˜๋ฏ€๋กœ 0ด๋ผ–ˆŒ) 1˜ ๊ฐ’„ คŒ
			else
				Array[i][j]=Array[i-1][j-1]+Array[i-1][j];
						// ๊ทธ ™ธ˜ ๊ฒฝšฐ—๋Š” ๊ณต‹„ ๋”ฐ๋ฅธ๋‹ค.
		}
	}

	ulong return_value=Array[m-1][n-1];
	// ›•˜๋Š” ๊ฐ’ ๋ฆฌ„ด(—ญ‹œ ๋ฐฐ—ด€ 0๋ถ€„‹œž‘•˜๋ฏ€๋กœ •˜๋‚˜”ฉ ๋นผ„œ)

	if(Array)	// Array 2ฐจ› ๋ฐฐ—ดด • ๋‹น๋˜—ˆ„๋•Œ
	{
		for(i=0;i<m;i++)
		{
			if(Array[i])
				delete [] Array[i];		// ง€›Œ ค€๋‹ค.(—ด)
		}
	}

	delete [] Array;		// ง€›Œ ค€๋‹ค.(–‰)

	return return_value;
}

  • ๋” ๋ณด๊ธฐ—๋„ žฌ๊ท€˜ธถœ๋ณด๋‹ค๋Š” ๋ณตžก•˜ฃ ?
  • ๊ทธ๋Ÿฐ๋ฐ.. †๋„๋Š” ™•‹คžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋ช‡๋ฐ„„–ด๋„ ฆ‰‹œฆ‰‹œ ๋‚˜˜ค๋Š”..
  • ด •Œ๊ณ ๋ฆฌฆ˜€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” “ฐ๋ฉด„œ †๋„๋ฅผ ‚ด๋ฆฐ ๋ฐฉ๋ฒ•ด๊ฒ ฃ ?
  • ž๋ฐ”๋กœ งœ๋ฉด ข€ ๋” ‰ฌšธ๊ฐ ๊ฐ™๋„—ฌ. ๋ฉ”๋ชจ๋ฆฌ ƒˆ๋Š”๊ธ ๊ ••˜ง€ •Š•„๋„ ๋˜๋‹ˆ..
  • ๋‹ค๋ฅธ ข‹€ ๋ฐฉ๋ฒ•ด žˆœผ‹œ๋ฉด —ฌ๊ธฐ๋‹ค  –ดฃผ‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • ใ…ก.ใ…ก ๊ฐ€..๊ฐ™๋‹ค.. --„ ˜ธ

dynamic allocation -zennith

~cpp 
int P(int row, int col) {
	/* ๋ณ€ˆ˜ „ –ธ๋ถ€ */
	int i, j, temp;

	/* —ฐ‚ฐ„ œ„•ด ดค‘  •ˆ˜˜• ฌธ„„ –ธ */
	int ** buffer;

	/* —ดด –‰๋ณด๋‹ค ด ๊ฒฝšฐ ข…๋ฃŒ */
	if(col > row)
		exit(0);

	/* buffer— –‰๋งŒผ˜  •ˆ˜ฌธ„˜•„ • ๋‹น๋ฐ›•„ ๋Œ€ž… */
	buffer = malloc( row * sizeof(int *) );

	for(i = 0; i < row; i++) {
		/* ๊ฐ๊ฐ˜  •ˆ˜ ฌธ„—  •ˆ˜ ๋ฐฐ—ด„ • ๋‹น•œ๋‹ค */
		*(buffer + i) = (int *)malloc( (i + 1) * sizeof(int) );

		/* • ๋‹น„ ‹คŒจ–ˆ„ ๋•Œ */
		if(*(buffer + i) == NULL) {

			/* ๋จผ € —ฌƒœ๊นŒง€ • ๋‹น•œ  •ˆ˜ ๋ฐฐ—ด„ ๋ฐ˜™˜ •˜๊ณ  */
			for(j = 0; j <= i; j++) {
				free(*(buffer + j));
			}

			/*  •ˆ˜ ฌธ„ฐ ๋ฐฐ—ด„ ๋ฐ˜™˜ •œ ›„ */
			free(buffer);

			/* ข…๋ฃŒ•œ๋‹ค */
			exit(0);
		}
	}

	/* —ฐ‚ฐ๋ถ€ */
	for(i = 0; i < row; i++) {
		for(j = 0; j <= i; j++) {
			/* —ดด 1ด๊ฐ๋‚˜ –‰๊ณผ —ดด ๊ฐ™€ ๊ฒฝšฐ, 1„ ๋Œ€ž… •œ๋‹ค */
			if(j == 0 || j == i) {
				*(*(buffer + i) + j) = 1;
				continue;
			}

			/* ๊ทธ๋ ‡ง€ •Š€ ๊ฒฝšฐ  „ –‰(i - 1)  „ —ด(j - 1)˜ ๊ฐ’๊ณผ,
			 „ –‰(i - 1) ๋™ —ด(j) ˜ ๊ฐ’„ ๋”•ด„œ ๋Œ€ž…•œ๋‹ค */
			*(*(buffer + i) + j) =
				*(*(buffer + i - 1) + j - 1) + *(*(buffer + i - 1) + j);
		}
	}

	/* ๊ณ„‚ฐ•œ ๊ฒฐ๊ณผ๊ฐ’„ ž„‹œ๋ณ€ˆ˜—  €žฅ•œ๋‹ค */
	temp = *(*(buffer + row - 1) + col - 1);

	/* ๋จผ €  •ˆ˜ ๋ฐฐ—ด„ ๋ฐ˜™˜•˜๊ณ  */
	for(i = 0; i < row; i++)
		free(*(buffer + i));

	/*  •ˆ˜ ฌธ„ฐ ๋ฐฐ—ด„ ๋ฐ˜™˜•œ๋‹ค */
	free(buffer);

	/* ž„‹œ๋ณ€ˆ˜—  €žฅ•œ ๊ฐ’„ ๋ฆฌ„ด */
	return temp;
}

  • •„ง ๊ฐœ„ •  ด •œ ๋‘ ๊ตฐ๋ฐ žˆ๋Š”๋ฐ.. ๊ตฌง€ —ฌ๊ธฐ— ˜ฌ๋ฆฐ ดœ ๋Š”  €๊ฒŒ Null pointer assignment —๋Ÿฌ๊ฐ€ ๋‚˜„œ.. —๋Ÿฌ๋‚œ๊™œ ˜ฌ๋ฆฌ๋Š”๋ฐ. ๋ผ๊ณ  •˜‹œ๋ฉด • ๋ง —†ง€๋งŒ.. ˜น‹œ ˜œ•ˆœผ๋กœ ‹œ›•˜๊ฒŒ ฐ”๋Ÿฌฃผ‹ค ๋ถ„ ง€ •ดฃผ‹œ๋ฉด ๊ฐ‚ฌ•˜๊ฒ Šต๋‹ˆ๋‹ค.
  • •ด๊ฒฐ–ˆŠต๋‹ˆ๋‹ค. ๋ฌธ œ —†ด ๋Œ•„๊ฐ€๋Š”๊ตฐš”.. —ญ‹œ ฌธ„ฐ๋Š” –ด๋ ต๊ณ  –ด๋ ค›Œ๋ผ..

ฒซ„๋ถ€„ญ‰ ๊ณ„‚ฐ•˜๋Š” ๋ฐฉ๋ฒ•

~cpp 
// ฒซ–‰๋ถ€„ฐ n–‰๊นŒง€ ๊ณ„‚ฐ•˜๋Š” ๋ฐฉ๋ฒ•„ †ต•ด
// ŒŒŠคนผ˜ ‚ผ๊ฐ˜•˜ n–‰ m—ด˜ ๊ฐ’„ ๊ตฌ•˜๋Š” •จˆ˜ (34–‰ ๊นŒง€ ๊ณ„‚ฐ ๊ฐ€๋Šฅ)
unsigned long PascalTriangle1(int n, int m)
{
	if(n<0 || n>35 || m<0 || m>n)	// –‰๊ณผ —ด˜ ๊ฐ’ด ž˜๋ชป๋œ๊ฒฝšฐ 0„ ๋ฆฌ„ด
		return 0;
	if(n==1 || n==2)	// 1–‰ ๋˜๋Š” 2–‰€ ๋ชจ๋‘ 1 ด๋ฏ€๋กœ 1„ ๋ฆฌ„ด
		return 1;

    // 2๊ฐœ˜ ๋ฐฐ—ด„ ‚ฌšฉ•˜—ฌ ๊ณ„‚ฐ„ •œ๋‹ค
	// •˜๋‚˜˜ ๋ฐฐ—ด— 2–‰„  €žฅ•œ ›„
	// ๊ทธ ๋ฐฐ—ด„ ‚ฌšฉ•ด 3–‰„ ๊ณ„‚ฐ•ด ๋‚˜๋จธง€ ๋ฐฐ—ด—  €žฅ•˜๊ณ 
	// ๋‹ค‹œ 3–‰ด  €žฅ๋œ ๋ฐฐ—ด„ ‚ฌšฉ•ด 4–‰„ ๊ณ„‚ฐ•ด„œ
	// 2–‰ด  €žฅ๋˜–ด žˆ๋˜ ๋ฐฐ—ด—  €žฅ•˜๊ณ 
	// ๊ณ„† ด™€๊ฐ™€ ‹œผ๋กœ n–‰ ๊นŒง€ ๊ณ„‚ฐ•œ๋‹ค

	unsigned long *row[2];	// 2๊ฐœ˜ ๋ฐฐ—ด˜ ฌธ„ฐ
	row[0]=new unsigned long[40];	// ตœ๋Œ€ 40—ด๊นŒง€  €žฅ•  ˆ˜ žˆ๋„๋ก ๋ฉ”๋ชจ๋ฆฌ • ๋‹น
	row[1]=new unsigned long[40];
	row[0][0]=row[0][1]=1;	// 2–‰„  €žฅ•œ๋‹ค
	int current=0;	// 2๊ฐœ˜ ๋ฐฐ—ด ค‘ ๊ณ„‚ฐค‘ธ ๋ฐฐ—ด„ ๋‚˜ƒ€๋‚ด๋Š” ๋ณ€ˆ˜

	for(int i=3;i<=n;i++)	// 3–‰๋ถ€„ฐ n–‰๊นŒง€ ๊ณ„‚ฐ
	{
		current=!current;	// ๊ณ„‚ฐ•  ๋ฐฐ—ด„ ๋ฐ”๊ฟˆ

		row[current][0]=1;	// ฒซ๋ฒˆงธ —ด€ •ญƒ 1
		row[current][i-1]=1;	// ๋งˆง€๋ง‰ —ด๋„ •ญƒ 1

		for(int j=1;j<i-1;j++)	// ๋‚˜๋จธง€ —ด„ ๊ณ„‚ฐ
			row[current][j]=row[!current][j-1]+row[!current][j];
	}

	// n–‰ m—ด˜ ๊ฐ’„ ๋ณด๊ด€
	unsigned long temp=row[current][m-1];
	delete[] row[0];	// • ๋‹น–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ •ด œ
	delete[] row[1];
	return temp;	// ๋ณด๊ด€•ด๋‘” n–‰ m—ด˜ ๊ฐ’„ ๋ฆฌ„ด
}

กฐ•ฉ˜ ˆ˜๋ฅผ ดšฉ•œ ๋ฐฉ๋ฒ•

~cpp 
// กฐ•ฉ˜ ˆ˜๋ฅผ ๊ณ„‚ฐ•˜๋Š” ๋ฐฉ๋ฒ•„ †ต•ด
// ŒŒŠคนผ˜ ‚ผ๊ฐ˜•˜ n–‰ m—ด˜ ๊ฐ’„ ๊ตฌ•˜๋Š” •จˆ˜ (17–‰๊นŒง€ ๊ณ„‚ฐ ๊ฐ€๋Šฅ)
unsigned long PascalTriangle2(int n, int m)
{
	if(n<0 || n>18 || m<0 || m>n)	// –‰๊ณผ —ด˜ ๊ฐ’ด ž˜๋ชป๋œ ๊ฒฝšฐ 0„ ๋ฆฌ„ด
		return 0;
	if(n==1 || n==2)	// 1–‰ ๋˜๋Š” 2–‰€ ๋ชจ๋‘ 1 ด๋ฏ€๋กœ 1„ ๋ฆฌ„ด
		return 1;
	// 5–‰ 1—ด๊ณผ 5–‰ 5—ด, 5–‰ 2—ด๊ณผ 5–‰ 4—ด ๋“€
	// ๊ฐ’ด ๊ฐ™ง€๋งŒ 5–‰ 1—ดด๋‚˜, 5–‰ 2—ดด ๊ณ„‚ฐด ๊ฐ„๋‹จ•˜—ฌ
	// ๊ณ„‚ฐค‘— ˜ค๋ฒ„”Œ๋กœšฐ๊ฐ€ ผ–ด๋‚˜๋Š” ๊ฒฝšฐ๋ฅผ „ผˆ˜ žˆ–ด
	// ๋”š ๋งŽ€ –‰„ ๊ณ„‚ฐ•  ˆ˜ žˆ๋‹ค
	// 5–‰ 5—ดด๋‚˜, 5–‰ 4—ด๊ณผ ๊ฐ™€ ๊ฒƒ„ 5–‰ 1—ดด๋‚˜, 5–‰ 2—ด๋กœ
	// ๋ฐ”๊ฟ”„œ ๋‹ค‹œ ˜ธถœ•ดฃผ๋Š” ๋ถ€๋ถ„ด๋‹ค
	if(m>n/2+n%2)
		return PascalTriangle2(n,n-m+1);

	unsigned long x=1,y=1, p;

    // (n-1)!/((n-1)-(m-1))! „ ๊ณ„‚ฐ
	p=n-1;
	for(int i=0;i<m-1;i++)
	{
		x*=p;
		p--;
	}

	// (m-1)! „ ๊ณ„‚ฐ
	for(p=m-1;p>=2;p--)
		y*=p;

	return x/y;	// (n-1)!/(((n-1)-(m-1))!*(m-1)!) „ ๋ฆฌ„ด
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:00
Processing time 0.0129 sec