[BOJ]10997 별찍기 - 22

강동현·2023년 12월 25일
0

코딩테스트

목록 보기
46/111

sol: 재귀: 해결하지 못했고, 제일 싫어하는 별찍기 재귀 문제
재귀 사진
가로 길이 = 1 -> 5 -> 9 -> 13 = 4(N-1)+1 = 4N - 3
세로 길이 = 1 -> 7 -> 11 -> 15 = 가로 길이 + 2(N != 1)

  • 각 시작점에서 아래 과정으로 별을 그려나갑니다.
  1. N==1N == 1
    ① 별 1개만 출력하고, return
  2. N==2N == 2
    ① 세로 방향으로 별 3개를 연속적으로 그리기
  3. N>=3N >= 3
    ① 왼쪽으로 width만큼 별 그리기
    ② 아래쪽으로 height만큼 별 그리기
    ③ 오른쪽으로 width만큼 별 그리기
    ④ 위로 height - 2 만큼 별 그리기
    ⑤ 왼쪽으로 별 1개를 그립니다.
  4. if(i==1)if(i == 1)
    이 코드를 수행하지 않아도, 결과물의 형태는 같지만, 문제가 다르게 본다(' ' != '\n)
#include <bits/stdc++.h>
using namespace std;
int N;
vector<vector<char>> board(1001, vector<char>(1001, ' '));
void drawStar(int x, int y, int n){
    //가로길이 = 4 * N - 3
    //세로길이 = 가로길이 + 2(N != 1)
    int width = 4 * n - 3;
    int height = width + 2;
    for(int i = 1; i < width; ++i) board[x][y--] = '*';
    for(int i = 1; i < height; ++i) board[x++][y] = '*';
    for(int i = 1; i < width; ++i) board[x][y++] = '*';
    for(int i = 1; i < height - 2; ++i) board[x--][y] = '*';
    board[x][y--] = '*';
    board[x][y] = '*';
    if(n == 2){
        board[x][y-1] = '*';
        board[x+1][y-1] = '*';
        board[x+2][y-1] = '*';
        return;
    }
    drawStar(x, y-1, n-1);
}
int main(){
    cin >> N;
    int width = 4 * N - 3;
    int height = width + 2;
    //N == 1일 땐, 따로 처리
    if(N == 1){
        cout << "*" << '\n';
        return 0;
    }
    //재귀 시작점 = 최초 너비 - 1
    int x = 0, y = 4 * N - 4;
    drawStar(x, y, N);
    for(int i = 0; i < height; ++i){
        if(i == 1){
            cout << '*' << '\n';
            continue;
        }
        for(int j = 0; j < width; ++j){
            cout << board[i][j];
        }
        cout << '\n';
    }
    return 0;
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글