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
반응형
'컴퓨터 > 알고리즘' 카테고리의 다른 글
[BOJ] N과 M(1), next_permutation풀이 (0) | 2021.11.08 |
---|---|
[BOJ] 1699. 제곱수의 합 (0) | 2021.10.28 |
[Programmers] 2021 kakao blind - 합승 택시 요금 (0) | 2021.10.01 |
[BOJ] 같은수로 만들기 2374, 13146 (분할정복, 스택) (0) | 2021.09.29 |
[BOJ] 12738, 14003 LIS(가장 긴 증가하는 수열, 이분탐색) - 2 (0) | 2021.09.25 |