BOJ 2448 : 별찍기 11 - C++

김정욱·2021년 3월 2일
0

Algorithm - 문제

목록 보기
130/249
post-custom-banner

별찍기 11

코드

#include <iostream>
#include <vector>
using namespace std;
char board[3072][6143];
void init(int N){
    for(int i=0;i<N;i++)
        fill(board[i], board[i]+2*N, ' ');
    int temp = N;
    for(int i=0;i<N;i++)
    {
        for(int j=N-i;j<=temp+i;j++)
        {
            board[i][j] = '*';
        }
    }
}
void star(int y, int x, int size){

    int st = x-size/2+1;
    int en = x+size/2-1;
    for(int i=y+size/2;i<y+size;i++)
    {
        for(int j=st;j<=en;j++)
        {
            board[i][j] = ' ';
        }
        st++;
        en--;
    }
    if(size == 3) return;
    star(y, x, size/2);
    star(y+size/2, x-size/2, size/2); 
    star(y+size/2, x+size/2, size/2);
    return;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int N;
    cin >> N;
    init(N);
    star(0, N, N);
    for(int i=0;i<N;i++)
    {
        for(int j=1;j<2*N;j++)
            cout<<board[i][j];
        cout << '\n';
    }
    return 0;
}
  • 로직
    1) board[][]를 모두 ' '으로 초기화
/* 반드시 넓이는 2*N으로 해야함 
   --> 정답 채점이 공백과 널문자를 구분하기때문 */
    for(int i=0;i<N;i++)
        fill(board[i], board[i]+2*N, ' ');

2) x좌표 N을 중심으로 증가해가며 별모양으로 init!
3) 현재 중앙 삼각형 부분을 공백처리한 후 재귀로 순환!

  • 주의할 점
    1) 배열의 높이는 최대 N / 넓이는 최대 2N 이다!
    2) x좌표가 0인 부분은 출력하지 않아야 한다
         --> 입출력 형식 맞춰주기 위함
profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글