티스토리 뷰
C언어 별찍기 기본
(0) [BOJ 2438] 별찍기-1
1 번째 줄에는 1개, 2 번째 줄에는 2개, .. 이런 식으로 증가하므로 i 번째 줄에는 i 개의 별을 출력해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=i; j++){ printf("*"); } printf("\n"); } return 0; } |
(1) [BOJ 2439] 별찍기-2
제일 쉽게 관찰할 수 있는 현상은 다음 줄로 넘어갈 때 마다,
별은 하나 증가하고 공백은 하나 감소한다는 것이다.
cnt_star = 별의 개수, cnt_blank = 공백의 갯수 를 뜻하는 변수를 선언하여 이 관찰을 그대로 실행시킬 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); int cnt_star=1, cnt_blank=n-1; for(int i=1; i<=n; i++){ for(int j=1; j<=cnt_blank; j++){ printf(" "); } for(int j=1; j<=cnt_star; j++){ printf("*"); } printf("\n"); cnt_star++; cnt_blank--; } return 0; } | cs |
i 번째 줄에서 빈칸은 n - i 개, 별은 i 개가 출력 되는 것을 관찰로 알아낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=n-i; j++){ printf(" "); } for(int j=1; j<=i; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
i 번째 줄에서 빈칸은 n - i 개, 별은 i 개가 출력 되는 것을 관찰로 알아낼 수 있다.
조건문 if 를 통해 아래와 같은 방식도 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(j<=n-i) printf(" "); else printf("*"); } printf("\n"); } return 0; } | cs |
(2) [BOJ 2440] 별찍기-3
i 번째 줄에는 n-i+1 개의 별이 찍힘을 알아낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=n-i+1; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
문제 (0) 번과 비슷하다. 차이점은 위아래가 바뀌었다는 점이다.
따라서 i 를 n - > 1로 거꾸로 돌려주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=n; i>=1; i--){ for(int j=1; j<=i; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
(3) [BOJ 2442] 별찍기-5
제일 쉽게 관찰할 수 있는 현상은 다음 줄로 넘어갈 때 마다,
별은 둘 증가하고 공백은 하나 감소한다는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); int cnt_star=1, cnt_blank=n-1; for(int i=1; i<=n; i++){ for(int j=1; j<=cnt_blank; j++){ printf(" "); } for(int j=1; j<=cnt_star; j++){ printf("*"); } printf("\n"); cnt_star+=2; cnt_blank--; } return 0; } | cs |
i 번째 줄에서 빈칸은 n - i 개, 별은 2*i-1 개가 출력 되는 것을 관찰로 알아낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=n-i; j++){ printf(" "); } for(int j=1; j<=2*i-1; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
C언어 별찍기 심화
(0) [BOJ 2445] 별찍기-8
cnt_star = 왼쪽 별의 개수, cnt_blank = 공백의 갯수
위와 같은 변수를 관리하면 ( i < n ) 인 i 번째 줄에선 cnt_star 가 하나 증가, cnt_blank 가 둘 감소함을 알 수 있다.
i >= n 일 경우엔 반대로 star 가 하나 감소하고 blank 가 둘 증가한다.
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 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); int cnt_star=1, cnt_blank=2*(n-1); for(int i=1; i<=2*n-1; i++){ for(int j=1; j<=cnt_star; j++){ printf("*"); } for(int j=1; j<=cnt_blank; j++){ printf(" "); } for(int j=1; j<=cnt_star; j++){ printf("*"); } printf("\n"); if(i<n){ cnt_star++; cnt_blank-=2; } else{ cnt_star--; cnt_blank+=2; } } return 0; } | cs |
위 아래를 한 번에 처리하는 것이 불편하다면, 두 영역으로 나누어 아래와 같이 처리할 수 있다.
n 번째 줄까진 i 번째 줄에서
별 i 개, 공백 2*(n-i)개, 별 i 개 가 순차적으로 온다.
그 이후론 i 를 n-1 부터 1까지 역순으로 돌려주면 된다.
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 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<=i; j++){ printf("*"); } for(int j=1; j<=2*(n-i); j++){ printf(" "); } for(int j=1; j<=i; j++){ printf("*"); } printf("\n"); } for(int i=n-1; i>=1; i--){ for(int j=1; j<=i; j++){ printf("*"); } for(int j=1; j<=2*(n-i); j++){ printf(" "); } for(int j=1; j<=i; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
(1) [BOJ 2446] 별찍기-9
cnt_star = 별의 개수, cnt_blank = 공백의 갯수
위와 같은 변수를 관리하면 ( i < n ) 인 i 번째 줄에선 cnt_star 가 둘 감소, cnt_blank 가 하나 증가함을 알 수 있다.
i >= n 일 경우엔 반대로 star 가 둘 증가하고 blank 가 하나 감소한다.
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 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); int cnt_star=2*n-1, cnt_blank=0; for(int i=1; i<=2*n-1; i++){ for(int j=1; j<=cnt_blank; j++){ printf(" "); } for(int j=1; j<=cnt_star; j++){ printf("*"); } printf("\n"); if(i<n){ cnt_star-=2; cnt_blank++; } else{ cnt_star+=2; cnt_blank--; } } return 0; } | cs |
위 아래를 한 번에 처리하는 것이 불편하다면, 두 영역으로 나누어 아래와 같이 처리할 수 있다.
n 번째 줄까진 i 번째 줄에서
공백 i-1개, 별 2*(n-i)+1 개 가 순차적으로 온다.
그 이후론 i 를 n-1 부터 1까지 역순으로 돌려주면 된다.
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 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); for(int i=1; i<=n; i++){ for(int j=1; j<i; j++){ printf(" "); } for(int j=1; j<=2*(n-i)+1; j++){ printf("*"); } printf("\n"); } for(int i=n-1; i>=1; i--){ for(int j=1; j<i; j++){ printf(" "); } for(int j=1; j<=2*(n-i)+1; j++){ printf("*"); } printf("\n"); } return 0; } | cs |
생각하기 편하도록 n=2*n-1 으로 늘려놓자.
i 번째 행, j 번째 열에 공백이 출력 되는 조건을 생각해 보자.
일단 j < i 를 만족해야 한다. 그래야 빨간선의 왼쪽에만 공백이 출력 된다.
그 다음, j < n-i+1 를 만족해야 한다. 그래야 빨간선의 왼쪽에만 공백이 출력 된다.
이 두 빨간선보다 왼쪽에 있으면 공백임을 알 수 있다.
여기서 if ( j < i && j < n-i+1 ) 을 만족하면 공백을 출력해야 함을 알 수 있다.
별 출력도 비슷한 방식으로 가능하다. 아래의 코드를 참고하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int n; scanf("%d",&n); n = 2*n-1; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(j<i && j<n-i+1) printf(" "); else if(j<=i || j<=n-i+1) printf("*"); } printf("\n"); } return 0; } | cs |
다중 반복문 문제
식을 써보면 GPA = C*G들의 합 / 총 학점 임을 알 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int t; scanf("%d",&t); for(int i=1; i<=t; i++){ int n, sum=0; double gpa=0.0; scanf("%d",&n); for(int j=1; j<=n; j++){ int c; double g; scanf("%d %lf",&c,&g); sum+=c; gpa+=c*g; } gpa/=sum; printf("%d %.1lf\n",sum,gpa); } return 0; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //code by RiKang, weeklyps.com #include <stdio.h> int main(void) { int t; scanf("%d",&t); for(int i=1; i<=t; i++){ int y=0, k=0; for(int j=1; j<=9; j++){ int y1,k1; scanf("%d %d",&y1,&k1); y+=y1; k+=k1; } if(y>k) printf("Yonsei\n"); else if(y<k) printf("Korea\n"); else printf("Draw\n"); } return 0; } | cs |