반응형
#INFO
난이도 : GOLD4
문제유형 : 재귀
출처 : 2448번: 별 찍기 - 11 (acmicpc.net)
#SOLVE
같은 패턴이 반복되는 재귀 유형 알고리즘 문제이다. 가장 기본이 되는 삼각형의 규칙을 찾아 base condition으로 설정한 뒤, 삼각형 각각의 좌표를 fill_star(배열에 알맞은 *을 채워 주는 함수)의 파라미터로 보낸 뒤 재귀로 호출하여 풀이하였다.
void fill_star(int x, int y){
board[x][y] = '*';
board[x+1][y-1] = '*';
board[x+1][y+1] = '*';
for(int i = y - 2; i <= y + 2 ; i++)
board[x+2][i] = '*';
}
재귀 함수 호출의 좌표는 세 삼각형의 위쪽 꼭지점 좌표를 보낸다. (ks = n / 2)
void recur(int k, int x, int y){
if(k == 3){
fill_star(x, y);
return;
}
int ks = k / 2;
recur(ks, x, y);
recur(ks, x + ks, y - ks);
recur(ks, x + ks, y + ks);
}
#CODE
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1024 * 3 + 2;
int n;
char board[MAX][MAX * 2 - 1];
void fill_star(int x, int y){
board[x][y] = '*';
board[x+1][y-1] = '*';
board[x+1][y+1] = '*';
for(int i = y - 2; i <= y + 2 ; i++)
board[x+2][i] = '*';
}
void recur(int k, int x, int y){
if(k == 3){
fill_star(x, y);
return;
}
int ks = k / 2;
recur(ks, x, y);
recur(ks, x + ks, y - ks);
recur(ks, x + ks, y + ks);
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
recur(n, 0, n-1);
for(int i = 0; i < n; i++){
for(int j = 0; j < n * 2 - 1; j++){
if(board[i][j] == '*')
cout << '*';
else
cout << ' ';
}
cout << '\n';
}
return 0;
}
반응형
'Archive2 > ProblemSolving' 카테고리의 다른 글
[BOJ] C++ 1759 "암호 만들기" 문제 풀이 _ nov (0) | 2022.04.17 |
---|---|
[BOJ] C++ 15663 "N과 M(9)" 문제 풀이 _ nov (0) | 2022.04.15 |
[BOJ] C++ 1182 "부분수열의 합" 문제 풀이 _ nov (0) | 2022.04.11 |
[BOJ] C++ 15652 "N과 M(4)" 문제 풀이 _ nov (0) | 2022.04.11 |
[BOJ] C++ 2447 "별 찍기" 문제 풀이 _ nov (0) | 2022.04.06 |