풀이
별을 아래의 그림처럼 노란색, 연두색, 하늘색, 분홍색으로 나누어 찍었다.
void mark_star(int p, int N){
if (N == 1)
arr[p][p] = arr[p+1][p] = arr[p+2][p] = '*'; // 노란색
else {
int row = 4*N-1, col = row-2;
for (int i = p; i < p+col; i++)
arr[p][i] = arr[p+row-1][i] = '*'; // 연두색
for (int i = p+2; i < p+row-1; i++)
arr[i][p] = arr[i][p+col-1] = '*'; // 하늘색
arr[p+1][p] = arr[p+2][p+col-2] = '*'; // 분홍색
mark_star(p+2, N-1);
}
}
N ~ 2번째는 연두색, 하늘색, 분홍색 부분에 별을 찍고, 마지막에 N = 1일 때, 노란색 부분에 별을 찍었다.
2번째 줄에는 별을 찍고 개행을 해야 한다는 점을 유의하자.
소스코드
#include <stdio.h>
#include <memory.h>
char arr[399][397];
void mark_star(int p, int N){
if (N == 1)
arr[p][p] = arr[p+1][p] = arr[p+2][p] = '*';
else {
int row = 4*N-1, col = row-2;
for (int i = p; i < p+col; i++)
arr[p][i] = arr[p+row-1][i] = '*';
for (int i = p+2; i < p+row-1; i++)
arr[i][p] = arr[i][p+col-1] = '*';
arr[p+1][p] = arr[p+2][p+col-2] = '*';
mark_star(p+2, N-1);
}
}
int main(){
int N;
scanf("%d", &N);
if (N == 1) putchar('*');
else {
memset(arr, 32, sizeof(arr));
mark_star(0, N);
int row = 4*N-1, col = row-2;
for (int i = 0; i < row; i++)
if (i != 1){
for (int j = 0; j < col; j++)
putchar(arr[i][j]);
putchar(10);
}else puts("*");
}
}
출처
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 11399] ATM [C] (0) | 2021.08.07 |
---|---|
[백준 13015] 별 찍기 - 23 [C] (0) | 2021.08.07 |
[백준 10996] 별 찍기 - 21 [C] (0) | 2021.08.07 |
[백준 10994] 별 찍기 - 19 [C] (0) | 2021.08.07 |
[백준 10995] 별 찍기 - 20 [C] (0) | 2021.08.06 |