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.0090 sec