https://www.acmicpc.net/problem/2523
<c언어>
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
int flag = 1;
int i = 1, cnt = 1;
while (i <= 2 * num - 1)
{
for (int j = 1; j <= cnt; j++)
{
printf("*");
if (i > (2 * num - 1) / 2)
flag = -1;
}
printf("\n");
cnt += flag;
i++;
}
}
> i는 줄을 나타내는 것이라 하면, i는 2*num-1까지 증가해야 한다.
왜냐하면 3을 입력(num)하면 줄은 5줄 까지이고, 5를 입력하면 줄은 9줄 까지이므로,
num을 입력하면 줄은 2*num-1까지이다.
> cnt 변수는 그 줄에서 찍어야 할 별의 개수를 나타낸다.
만약 num이 5라면,
첫번째 줄에서의 cnt는 1이고, 두번째 줄에서의 cnt는 2이고, 세번째 줄에서의 cnt는 3이고,
네번째 줄에서의 cnt는 2이고, 다섯번째 줄에서의 cnt는 1이다.
> 이 모양은 i가 (2*num-1)/2 보다 커지는 순간 부터는
찍어야 하는 별의 개수가 다시 감소하므로(상하대칭의 모양), i <= (2*num-1)/2 일때는 +1을 더하다가
i가 (2*num-1)/2번째 줄을 넘어가는 순간 부터는 -1을 더해야 한다.
> 이를 flag 라는 상태를 처리하는 변수를 하나 두어 해결할수 있다. 일정 임계값을 넘어가면 flag의 값을 바꿔주고, 그것에 상관없이 cnt에는 항상 flag를 더해주는 과정을 거친다. 여기서의 임계값을 넘어가는 순간은 i가 (2*num-1)/2 보다 커지는 순간이다.
> 보통 이렇게 상태를 기록하고 처리의 흐름을 제어하기 위해 flag 같은 변수를 boolean형으로 많이 사용하곤 한다.
여기에서는 int 형으로 사용하였다.
> 한 줄에 별을 출력하였으면 개행을 해야하므로, for문이 한번 끝날때 마다 printf("\n")을 해준다.
'Problem Solving > 백준' 카테고리의 다른 글
[백준] 2446번 : 별 찍기 - 9 (0) | 2020.03.15 |
---|---|
[백준] 10996번 : 별 찍기 - 21 (0) | 2020.03.15 |
[백준] 1436번 : 영화감독 숌 (0) | 2020.02.29 |
[백준] 1932번 : 정수 삼각형 (0) | 2020.02.25 |
[백준] 2751번 : 수 정렬하기 2 (0) | 2020.02.24 |