안경잡이 구루루

백준 2446 ( 별 찍기 - 9 ) [ C programming ] 본문

C언어(C programming)/문제풀이(백준,BaekJoon)

백준 2446 ( 별 찍기 - 9 ) [ C programming ]

구루루(gururu) 2020. 6. 2. 11:54
반응형


나:

#include <stdio.h>
int main() {
	int N, NN;
	scanf("%d", &N);
	NN = N;
	for (int i = 0; i <  N; i++) {
		for (int j = 0; j < i; j++) {
			printf(" ");
		}
		for (int j = 0; j < 1 + 2 * (NN - 1); j++) {
			printf("*");
		}
		NN = NN - 1;
		printf("\n");
	}
	NN = 1;
	for (int i = N-1; i > 0; i--) {
		for (int j = i-1; j > 0; j-- ) {
			printf(" ");
		}
		for (int j = 0; j < 1+2*NN; j++) {
			printf("*");
		}
		++NN;
		printf("\n");
	}
	return 0;
}

완성된 코드는 위와 같다.

 

#include <stdio.h>
int main() {
	int N, NN;
	scanf("%d", &N);

 

입력값으로 받는 N과 별( * )출력을 활용하기 위한 NN의 자료형을 선언하고 사용자 입력값을 scnaf로 받는다

 

	NN = N;
	for (int i = 0; i <  N; i++) {
		for (int j = 0; j < i; j++) {
			printf(" ");
		}
		for (int j = 0; j < 1 + 2 * (NN - 1); j++) {
			printf("*");
		}
		NN = NN - 1;
		printf("\n");
	}

크게 두 부분으로 나눈다. 별( * )이 2개씩 줄어드는 부분과 증가하는 부분으로 나눈다.

위 코드는 별이 줄어드는 부분으로 for 충첩 반복문을 이용해서 별의 개수를 조절했다.

2개씩 줄어드는 반복은 N번 걸쳐서 일어난다. i를 통해 반복을 하는데  이때 빈칸 출력의 개수는 i의 개수와 같다.

출력의 개수는 최대치 2*( NN -1 )에서 1개로 줄어든다.

이때 별의 출력 반복은 횟수는  j를 이용하고 출력 개수는 NN로 조절한다. 다음줄( \n )로 넘어갈 때마다 NN-1을 해서 각 줄마다 개수가 2개씩 줄어들도록 해야하기 때문에 내부 반복문이 끝나고 나서 명령어를 수행시킨다.

 

	NN = 1;
	for (int i = N-1; i > 0; i--) {
		for (int j = i-1; j > 0; j-- ) {
			printf(" ");
		}
		for (int j = 0; j < 1+2*NN; j++) {
			printf("*");
		}
		++NN;
		printf("\n");
	}
	return 0;
}

위 코드는 별이 2개씩 증가하는 부분으로  앞의 출력에서 1개까지 출력했으니 별을 3개부터 증가시켜 나가야 한다.

그래서 총 반복회수는 N-1번으로 설정한다.  빈칸 출력의 개수는 i-1개에서 1개씩 줄어들도록 반복한다.

출력의 개수는 3개 부터 출력해서 2개씩 증가시켜야 하기 때문에 NN을 1로 설정하고 1+2*NN을 통해 반복한다.

이때 별의 출력반복 횟수는 j 를 이용하고 출력개수는 NN으로 조절한다. 다음줄( \n )로 넘어갈 때마다 1+2*NN을 해서각 줄마다 개수가 2개씩 증가시켜야 하기 때문에 내부 반복문이 끝난 후 ++NN을 한다.


다른사람:

https://raise-meow.tistory.com/53

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		for (int j = i-1; j > 0; j--)printf(" ");
		for (int k=2*n-i*2+1; k > 0; k--)printf("*");
		printf("\n");
	}
	for (int i = n-1; i > 0; i--) {
		for (int j = i-1; j > 0; j--)printf(" ");
		for (int k = 2 * n - 2 * i+1; k > 0; k--)printf("*");
		printf("\n");
	}
	return 0;
}

완성된 코드는 위와 같다.

 

	for (int i = 1; i <= n; i++) {
		for (int j = i-1; j > 0; j--)printf(" ");
		for (int k=2*n-i*2+1; k > 0; k--)printf("*");
		printf("\n");
	}

 

처음 선언한 N의 자료형과 반복을 위한 변수 i, j, k로만 문제를 해결했다.

위 코드는 별의 개수가 2개씩 감소하고 빈칸이 0개부터 1개씩 증가하는 부분이다.

총 반복횟수는 외부반복문의 i 를 1씩 증가시켜 N까지 반복하도록 했다.  

이때 빈칸은 증가하는 i를 이용해 i-1부터 0까지 반복을 통해 빈칸출력 개수를 조절했다. 

그리고 별 출력의 개수는 최대별의 개수 2* n +1 에서 2개씩 감소하기 때문에 i *2 을 뺀 값만큼 1개까지 출력.

i를 기준으로 빈칸 개수 j, 별의 개수 *를 유기적으로 연결시켰다.

 

	for (int i = n-1; i > 0; i--) {
		for (int j = i-1; j > 0; j--)printf(" ");
		for (int k = 2 * n - 2 * i+1; k > 0; k--)printf("*");
		printf("\n");
	}
	return 0;
}

위 코드는 별의 개수가 2개씩 증가하고 빈칸의 개수가 0개까지 감소하는 부분이다.

이전에 1개까지 별을 출력했으니 n-1만큼 반복한다.

빈칸 출력의 개수최대빈칸개수 i-1에서 1개씩 각 줄마다 감소하며 반복하도록 했다.

별 출력의 개수  최대출력개수 2*n+1에서 계속 감소하는 외부반복문 i를 활용2 * i 를 만들어 서로 뺀다.

이렇게 되면 별의 개수는 3개부터 2개씩 증가하도록 만들 수 있다.

 

반응형