본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 10997 별 찍기 - 22

by 까망 하르방 2021. 2. 26.
반응형

출처: 출처: https://www.acmicpc.net/problem/10997

 Input 
2

 Output 

*****
*
* ***
* * *
* * *
*   *
*****

가로/세로 길이의 변화 (※ n = 1인 초기값 제외)

(가로) 1 → 5   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번째 줄에서는 별 한개를 출력한 후에는

공백없이 줄넘김 처리되어야 출력형식을 만족할 수 있습니다.

 

 [문제] BOJ 별 찍기 시리즈

 

[문제] BOJ 별 찍기 시리즈

[BOJ] 2438 별 찍기 - 1 [BOJ] 2439 별 찍기 - 2 [BOJ] 2440 별 찍기 - 3 [BOJ] 2441 별 찍기 - 4 [BOJ] 2442 별 찍기 - 5 [BOJ] 2443 별 찍기 - 6 [BOJ] 2444 별 찍기 - 7 [BOJ] 2445 별 찍기 - 8 [BOJ] 2446 별..

zoosso.tistory.com


#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

댓글