본문 바로가기
컴퓨터/알고리즘

[BOJ] 2448. 별찍기-11

by IT황구 2021. 11. 4.
728x90
반응형

https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

여기까지 푸니 이제서야 재귀가 뭔지 와닿는다. 뭔가 말로 표현은 할 수없는데.. 어떻게 되는지 조금 생각할 수 있게됨

규칙 :

1. 이게 N = 12일때 인데, 뭔가 재귀함수 내에서 3개로 나눠서 호출하면 될 것 같다는 생각을 함

2. 파란 네모 단위로 배열에 담으면 되겠다는 생각

3. 시작점만 잘 주면 풀리겠다는 생각

4. 시작점을 어떻게 찾을까?

N = 12일때(빨간색 네모로 들어가보자)

div = N/2;

recur(div, x, y+div); // 위에 빨간 원

recur(div, x+div,y); // 왼쪽아래 원

recur(div, x+div, y+ 2*div) //오른쪽아래 원

5. 구간을 나누고, N=3일때는 즉 파란색 네모부터는 그냥 배열에 담는 작업 하면 됨

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char board[3200][6400];
void recur(int n, int x, int y)
{
    if(n == 3){
        for(int i = x; i < x+n; i++)
        {
            for(int j = y; j < y+2*n; j++)
            {
                if(i == x && j == y+2) board[i][j] = '*';
                else if(i == x+1 && (j == y+1 || j == y+3) ) board[i][j] = '*';
                else if(i == x+2 && j < y+5) board[i][j] = '*';
            }
        }
        return;
    }
    int div = n/2;
    recur(div,x,y+div);
    recur(div,x+div,y);
    recur(div,x+div,y+n);

}
int main(void)
{
    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*2,' ');
    recur(n,0,0);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < 2*n; j++)
        {
            cout << board[i][j];
        }
        cout << "\n";
    }

    return 0;
}

빠르게 규칙을 찾지 못했고, fill에서 y값들은 n*2개만큼 필요한데, n으로 둬서 오류를 찾는데 좀 걸림

끝!!

728x90
반응형