BOJ 2447 : 별찍기 10 - C++

10616 단어 재귀silverbojboj

별찍기 10

코드

#include <iostream>
#include <vector>
using namespace std;
char board[2200][2200];
void pattern(int y, int x, int size){
    if(size == 0) return;
    for(int i=y+size/3;i<y+size/3+size/3;i++)
    {
        for(int j=x+size/3;j<x+size/3+size/3;j++)
        {
            board[i][j] = ' ';
        }
    }
    int one = size/3;
    int two = size/3 + size/3;

    /* 가운데 부분을 제외한 8부분에 대해 재귀 실행 */
    pattern(y, x, size/3);
    pattern(y+one, x, size/3);
    pattern(y+two, x, size/3);
    pattern(y, x+one, size/3);
    pattern(y, x+two, size/3);
    pattern(y+one, x+two, size/3);
    pattern(y+two, x+one, size/3);
    pattern(y+two, x+two, size/3);
    return;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int N;
    cin >> N;
    for(int i=0;i<N;i++)
        fill(board[i], board[i]+N, '*');
    pattern(0, 0, N);
    for(int i=0;i<N;i++)
        cout << board[i]<<'\n';
    return 0;
}
  • 원리
    1) 일정 구역에서 항상 중간에 해당되는 부분은 ' '값을 가지도록 저장
    (y와 x의 범위가
    y+size/3 ~ y+size/3+size/3
    x+size/3 ~ x+size/3+size/3 일 때 항상 ' '값
    을 가짐)
    2) 가운데 부분을 제외하고 나머지 8부분에 대해 재귀 수행
  • 다른 풀이는 ?
    : ' ' 값을 가지는 좌표들의 특징을 찾아서 해결
    (y/size%3 == 1 && x/size%3 == 1 일 때 공백임!)

좋은 웹페이지 즐겨찾기