반응형
출처: 출처: https://www.acmicpc.net/problem/10997
Input
2
Output
*****
*
* ***
* * *
* * *
* *
*****
가로/세로 길이의 변화 (※ n = 1인 초기값 제외)
(가로) 1 → 5 → 9 → 13 → 4(n-1) + 1 = 4n - 3
(세로) 1 → 7 → 11 → 15 → 가로 길이 + 2
재귀함수를 이용해서 구현합니다.
각 재귀함수의 시작점은 다음과 같습니다.
각 시작점에서 아래 과정으로 별을 그려나갑니다.
① 왼쪽으로 width만큼 별 그리기
② 아래쪽으로 height만큼 별 그리기
③ 오른쪽으로 width만큼 별 그리기
④ 위로 height - 2 만큼 별 그리기
⑤ 왼쪽으로 별 1개를 그립니다.
⑥ n > 3일 때는 위의 과정을 수행한 후 다음 단계의 시작점을 매개변수로 넘겨주면 되지만
n = 2일 때는 마무리 단계로 세로 방향으로 별 3개를 연속적으로 그려서 종료합니다.
(※ 입력받은 n = 1인 경우 별 한개만 출력하여 return)
출력되는 결과에서 2번째 줄에서는 별 한개를 출력한 후에는
공백없이 줄넘김 처리되어야 출력형식을 만족할 수 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
char map[399][397];
void drawStar(int n, int x, int y) {
int width = 4 * n - 3;
int height = width + 2;
for (int i = 1; i < width; i++) map[x][y--] = '*';
for (int i = 1; i < height; i++) map[x++][y] = '*';
for (int i = 1; i < width; i++) map[x][y++] = '*';
for (int i = 1; i < height - 2; i++) map[x--][y] = '*';
map[x][y] = '*';
y--;
map[x][y] = '*';
if (n == 2) {
map[x][y-1] = '*';
map[x+1][y-1] = '*';
map[x+2][y-1] = '*';
return;
}
drawStar(n-1, x, y-1);
}
int main(void) {
int n;
cin >> n;
if (n == 1) {
printf("*");
return 0;
}
int width = 4 * n - 3;
int height = width + 2;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
map[i][j] = ' ';
}
}
int x = 0, y = 4*n - 4;
drawStar(n, x, y);
for (int i = 0; i < height; i++) {
// 둘째 줄 예외 처리
if (i == 1) {
printf("*\n");
continue;
}
for (int j = 0; j < width; j++) {
printf("%c", map[i][j]);
}
cout << "\n";
}
return 0;
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 10996 별 찍기 - 21 (0) | 2021.02.26 |
---|---|
[BOJ] 백준 10993 별 찍기 - 18 (0) | 2021.02.26 |
[BOJ] 백준 10994 별 찍기 - 19 (0) | 2021.02.26 |
[BOJ] 백준 1405 미친 로봇 (0) | 2021.02.26 |
[BOJ] 백준 1063 킹 (0) | 2021.02.26 |
댓글