본문 바로가기
Problem Solving/백준

[백준] 2523번: 별 찍기 - 13

by shinbian11 2020. 3. 15.

https://www.acmicpc.net/problem/2523

 

2523번: 별 찍기 - 13

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

<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")을 해준다.