상세 컨텐츠

본문 제목

C 언어 예제, 별탑 쌓기

컴퓨터 관련/C 언어 예제

by 열정과 함께 2013. 8. 13. 20:38

본문

 이 글의 목표는


 이렇게 만드는 것이다.


 먼저 일단 코딩 한 것.


/* 별 찍기 임의의 입력된 수 N 개의 층 모양을 한 피라미드 모양의 별을 쌓는다*/

#include <stdio.h>

int main()

{

int i,j,n,k;

printf("몇 줄의 별탑을 쌓겠습니까?");

scanf("%d", &n);

if(n==1)

{

printf("1 개 층의 탑은 쌓을 수 없습니다 \n");

}

else

{

for(k=1;k<n-3;k++)

{

printf(" ");

}

printf("n = %d \n", n);

for(i=1;i<=n;i++)

{

for(j=0;j<=n-i;j++)

{

printf(" ");

}

for(j>n-i;j<n+i;j++)

{

printf("*");

}

printf("\n");

}

}

return 0;

}


 나는 이 문제풀이를 이렇게 접근했다. 예를 들어 3개 층의 탑을 쌓는다고 해보자. 편의를 위해 공백 표시를 '_' 로 표기한다면, 이 코딩의 목표는 이렇게 만드는 것이 된다.


__*__

_***_

*****


 별 뒤의 부분은 실질적으로 필요 없는 부분이다. 그냥 줄바꿈 코드를 입력하면 해결된다. 그러니 여기서 필요한 것은 일정 개수의 공백과 일정 개수의 * 를 입력하는 것이 된다. 그런데 가만히 보면 이는 수열의 모습을 따른다는 것을 알 수 있다. 맨 윗줄에서 일정 개수의 공백이 입력되면, 아랫줄에서 입력되는 공백은 하나씩 감소. 별은 하나씩 증가.


 그럼 이제 코딩된 부분을 뜯어보자.


/* 별 찍기 임의의 입력된 수 N 개의 층 모양을 한 피라미드 모양의 별을 쌓는다*/

#include <stdio.h>

int main()

{

int i,j,n,k;

i : 행렬의 행. j : 행렬의 열. n, 탑의 층 수. k 는 별로 필요없는 변수. 탑 맨 위에 숫자 올리려고

printf("몇 줄의 별탑을 쌓겠습니까?");

scanf("%d", &n);

if(n==1)

{

printf("1 개 층의 탑은 쌓을 수 없습니다 \n");

}

else

{

이 for 구문 부분은 별로 필요 없음. 탑의 핵심은 아님.

for(k=1;k<n-3;k++)

{

printf(" ");

}

printf("n = %d \n", n);

여기부터는 탑 쌓는데 진짜로 필요함

일단 생각해 보면, 탑의 형태는 가운데에 별이 박혀 있고, 한 줄이 내려갈 수록 양 옆에 붙은 별이 하나씩 늘어난다고 생각할 수 있다. 그렇다면, 첫 줄에서는 가운데에만 하나, 둘째 줄에서는 가운데에서 한 개, 셋째 줄에서는 가운데에서 두 개.... 이런 식으로 이어지게 된다.

for(i=1;i<=n;i++)

{

for(j=0;j<=n-i;j++)

{

printf(" ");

}

2번째 줄에서는 별이 양 옆에 한개씩 들어가므로, 2개 띄어진 곳에는 별이 아니라 공백이 들어간다. 따라서 층 값 n 에서, 행 값인 i 만큼 떨어진 곳에는 공백이 들어가야 하므로, j <= n-i 까지는 공백이 들어간다.

for(j>n-i;j<n+i;j++)

{

printf("*");

}

별이 들어가기 시작한다면, 이 별은 좌우 대칭의 갯수로 입력되어야 한다. 그렇게 생각하면, j <= n-i 까지 '공백' 이므로, j >= n+i 부터 공백이 들어가면 된다. 따라서 이렇게 표기해 줄 수 있다. 필요한 별을 모두 찍었으므로 줄바꿈을 입력해 주면 끝!

printf("\n");

}

}

return 0;

}


파생 문제, 역삼각형 별 쌓기

/* 파생형, 역삼각형 별찍기*/

#include <stdio.h>

int main()

{

int i,j,n,k;//i : 행렬의 행. j : 행렬의 열. n, 탑의 층 수. k 는 별로 필요없는 변수. 탑 맨 위에 숫자 올리려고//

printf("몇 줄의 별탑을 쌓겠습니까?");

scanf("%d", &n);

if(n==1)

{

printf("1 개 층의 탑은 쌓을 수 없습니다 \n");

}

else

{

for(k=1;k<n-3;k++)//이 for 구문 부분은 별로 필요 없음. 탑의 핵심은 아님.

{

printf(" ");

}

printf("n = %d \n", n);

for(i=1;i<=n;i++)//여기부터는 탑 쌓는데 진짜로 필요함

{

for(j=1;j<=i-1;j++)

{

printf(" ");

}

for(j>i-1;j<=2*n-i;j++)

{

printf("*");

}

printf("\n");

}

}

return 0;

}




관련글 더보기

댓글 영역