일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 그리디
- 입문
- C Programming
- C
- Beakjoon
- Python
- 파이썬
- 백준
- 친절한 설명
- 설명
- Implemention
- 문제풀이
- Baekjoon
- C 언어
- 코드엔진
- 알고리즘
- c언어
- 꾸준히
- 문자열
- HTML
- implement
- 심화1
- 구현
- 10807
- 10926
- CSS
- 정리
- 초보
- greedy
- VS
- Today
- Total
안경잡이 구루루
백준 2446 ( 별 찍기 - 9 ) [ C programming ] 본문
백준 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개씩 증가하도록 만들 수 있다.
'C언어(C programming) > 문제풀이(백준,BaekJoon)' 카테고리의 다른 글
백준 10818 ( 최소 , 최대 ) [ C programming ] (0) | 2020.06.15 |
---|---|
백준 2562 ( 최대값 ) [ C programming ] (0) | 2020.06.08 |
백준 10817 ( 세 수 ) [ C programming ] (0) | 2020.05.30 |
백준 2523 ( 별 찍기 -13 ) [ C programming ] (0) | 2020.05.30 |
백준 5543 ( 상근날드 ) [ C programming ] (0) | 2020.05.28 |