역피라미드, 피라미드, 모래시계형을 만들어볼 것이다.
역피라미드 만들기
- Thinking
- 공백의 패턴은 어떠한가? : 외부 for문 i가 증가하는 갯수만큼 공백 증가.
- 별은 어떻게 나타낼 것인가? : 약간의 그림을 그려보고, 패턴을 찾는다.
- 역 피라미드의 경우, 외부 for문 i가 0부터 시작하고, 높이가 h이라는 가정 하에 별의 갯수는 2*h-(2*i+1)이다.
이것을 가지고 코딩을 해보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++)
{
for (int j = 0; j < i; j++)
{
printf(" ");
}
for (int k = 0; k < 2 * h - (2 * i + 1); k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
1. int h(높이)를 선언한 후 입력할 수 있도록 만든다.
2. 세로 기둥을 세운다. [ for (int = 0; i < h; i++) ]
3. 공백찍는 가로를 만든다. 공백은 0부터 시작하는 i의 카운트를 그대로 따라가면 되므로 j가 i보다 작을 경우로 한다.
4. 공백을 출력한다.
5. 다음으로 별을 찍는다. 별 찍는 for문의 변수는 k로 설정하고, 0부터 시작하되
- 역피라미드 별 갯수 공식인 2*h-(2*i+1)을 고려하여 코딩한다.
6. 완료 후 별을 찍고 개행한다.
컴파일된 내용 보기
피라미드 만들기
- Thinking
- 입력한 높이에 따른 공백 공식은 무엇인가? : h - i - 1 (h: 높이, i: 외부 for문 반복)
- 입력한 높이에 따른 별찍기 공식은 무엇인가? : 2i + 1 (i : 외부 for문 반복)
이것을 가지고 코딩해보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++)
{
for (int j = 0; j < h - i - 1; j++)
{
printf(" ");
}
for (int k = 0; k < 2 * i + 1; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
1. 높이 변수 h를 입력할 수 있게 한다.
2. 세로 기둥을 세운다.
3. 가로 공백의 공식을 넣어 코딩한다. // h - i - 1 (h: 높이, i: 외부 for문 반복)
4. 가로 별찍기 공식을 넣어 코딩한다. // 2i + 1 (i : 외부 for문 반복)
5. 개행한다.
컴파일된 내용 보기
모래시계 만들기!!
- Thinking
- 모래시계 구조가 어떻게 생겼는가? : 역피라미드 + 피라미드
- 두 부분으로 나누어 for문을 설계한다.
- 공식은 역피라미드와 피라미드를 만들면서 이미 파악했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++) // 역피라미드 기둥
{
for (int j = 0; j < i; j++) // 역피라미드 공백 공식
{
printf(" ");
}
for (int k = 0; k < 2 * h - (2 * i + 1); k++ ) // 역피라미드 별표 공식
{
printf("*");
}
printf("\n");
}
for (int i = 1; i < h; i++) // 피라미드 기둥 (바로 위에 1만 남은게 있으니 +1 상태 시작)
{
for (int j = 0; j < h - i - 1; j++) // 피라미드 공백 공식
{
printf(" ");
}
for (int k = 0; k < 2 * i + 1; k++) // 피라미드 별표 공식
{
printf("*");
}
printf("\n");
}
return 0;
}
1. 높이로 이용할 변수 h를 입력받을 수 있도록 설계한다.
2. 역피라미드 세로 기둥을 세운다
3. 공백 공식을 따라 역피라미드의 공백을 for문으로 설계한다.
4. 별표 공식을 따라 역피라미드의 별표 삽입을 for문으로 설계한다.
5. 개행한다
and
1. 피라미드 세로 기둥을 세운다.
- 이때 역피라미드의 맨 아랫칸 별표가 1인것을 감안하여 i를 미리 하나 가산한다.
(가산하지 않으면 피라미드 허리에 별 한개짜리가 두개 생긴다.)
- 피라미드 공백 공식을 그대로 적용한다.
- 이후 피라미드 별표 공식을 적용한다.
- 개행후 완료한다.
컴파일된 내용 보기
이걸 왜 못푸나 싶었다.
머리로는 이해해도 for문을 잘 이해하지 못하면 풀기 어려운 문제였던 것 같다.
한번 이해하니 쭉쭉 만들 수 있었다.
너무 재미있다.
앞으로의 알고리즘문제도 재미있게 다가가야지!
'C, C++' 카테고리의 다른 글
[C언어] FizzBuzz / 삼항연산자 중첩 (2) | 2022.04.28 |
---|---|
C언어 코딩도장(goto 사용하기) (0) | 2022.04.28 |
[C언어] for문 별 찍기 1편 (0) | 2022.04.27 |
C언어 코딩도장(break, continue로 반복문 제어하기) (0) | 2022.04.27 |
C언어 코딩도장(do while 반복문으로 최소 한번은 실행하기) (0) | 2022.04.27 |