티스토리 뷰
서론
프로그래밍 언어를 배우면서 표준입출력을 배운 후에 꼭 하는 일이 있다.
바로 *(별)으로 피라미드를 쌓는 것이다.
아마 대부분의 교수님들께서 이 동일한 과제를 내는 것으로 봤을 때, print 문과 반복 구조를 시험하기에 피라미드 쌓기 문제만큼 효과적인 게 없는 게 아닐까?
피라미드 쌓기
별(*)으로 피라미드를 어떻게 쌓아야 하는가는 사람마다 다르지만, 보통 이러한 출력을 콘솔창에 띄울 수 있으면 된다.
여기서 포인트는 피라미드가 가운데 정렬되어야 한다는 사실이다.
다행히 별의 오른쪽에 공백을 출력할 필요는 없었다.
즉, 아래처럼 출력하면 감점 사유가 된다.
문제 해결 알고리즘
필자는 이 문제를 해결하기 위해 몇 가지 생각을 거쳤다.
일단 입력받는 숫자는 피라미드의 층 수이다.
그리고 가장 처음에 출력되는 별이 정확하게 가운데 있기 위해서는 공백(" ")까지 출력해줘야 한다.
별의 개수와 공백의 개수는 피라미드의 층 수에 따라 달라지므로, 이 둘 사이의 관계를 찾으면 문제 구상이 끝나며 코딩만 남는다.
피라미드의 층 수를 num이라 하고, 한 층에 출력되는 *(별)의 개수와 공백의 개수 사이의 관계를 찾아보자.
이를 위해 위에서 언급한 6층 짜리 피라미드를 살펴보자.
6층 - 별1개, 공백 5개
5층 - 별3개, 공백 4개
4층 - 별5개, 공백 3개
3층 - 별7개, 공백 2개
2층 - 별9개, 공백 1개
1층 - 별11개, 공백 0개
즉, 피라미드 층 수가 내려갈수록,
별의 개수는 첫 항이 1이고 공차가 2인 등차수열을 따르고,
공백의 개수는 하나씩 감소하여 가장 아래 층에서는 0이 된다.
이 관계를 프로그래밍 언어로 구현하면 끝이다.
C로 구현한 피라미드 쌓기 문제
#include <stdio.h>
int main(void) {
int num;
// FILE * fp = fopen("pyramid.txt", "w");
printf("피라미드 층수를 입력하세요:");
scanf("%d", &num);
if (num <= 0) {
printf("(오류) 자연수를 입력해야합니다.");
return -1;
}
for (int i = 0; i < num; i++) {
int star_number = 2 * (i + 1) - 1;
int blank_number = (num - 1) - i;
for (int p = 0; p < blank_number; p++) {
// fprintf(fp, " ");
printf(" ");
}
for (int q = 0; q < star_number; q++) {
// fprintf(fp, "*");
printf("*");
}
// fprintf(fp, "\n");
printf("\n");
}
// fclose(fp);
return 0;
}
잘 출력되었다.
'Programming > C' 카테고리의 다른 글
Code Server에서, C/C++ 확장 플러그인 충돌 문제 해결법 (1) | 2021.02.04 |
---|
- Total
- Today
- Yesterday
- String Name = Miru(itmir913);
- String Mail = itmir913@gmail.com;
- String github = https://github.com/itmir913;