-
[백준, 별 찍기]Computer Science/백준 Boj 2023. 11. 6. 16:52
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
접근법
재귀를 통해서 풀고, 가운데 부분은 별을 그리지 않을 것이므로 재귀를 사용하지 않는다.
N이 3이 되는 순간 별을 그린다.
if (3 == N) { print_star(star, sColumn, eColumn, sRow, eRow); return; }
N != 3이면 3분할 후 3번의 재귀를 호출한다.
i와 j가 1인 경우는 재귀를 호출하지 않는다.
if (i == 1 && j == 1) { }else
size만큼 배열의 수를 0 ~ 2까지 키워가며 가로와 세로의 배열의 재귀를 호출한다.
func_star(star, sColumn + j * Size, sColumn + (j + 1) * Size, sRow + i * Size, sRow + (i + 1) * Size, Size);
코드
#include <iostream> #include <string> #include <vector> using namespace std; void print_star(vector<vector<char>>& star, int sColumn, int eColumn, int sRow, int eRow) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (i == 1 && j == 1) { } else star[sRow + i][sColumn + j] = '*'; } } } void func_star(vector<vector<char>>& star, int sColumn, int eColumn, int sRow, int eRow, int N) { if (3 == N) { print_star(star, sColumn, eColumn, sRow, eRow); return; } else { int Size = N / 3; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { if (i == 1 && j == 1) { }else func_star(star, sColumn + j * Size, sColumn + (j + 1) * Size, sRow + i * Size, sRow + (i + 1) * Size, Size); } } } } int main() { int N = 0; cin >> N; vector<vector<char>> star = vector<vector<char>>(N, vector<char>(N, ' ')); func_star(star, 0, N, 0, N, N); for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { cout << star[i][j]; } cout << endl; } return 0; }
'Computer Science > 백준 Boj' 카테고리의 다른 글
[백준, 백트래킹] 연산자 끼워넣기 (0) 2023.11.06 [백준 재귀] 하노이 탑 이동 순서 C++ (복습 필요) (1) 2023.10.28 [백준, DP] 연속합 C++(복습필요) (0) 2023.10.24 [백준 조합] 제출 C++ (0) 2023.10.23 [백준 조합] 팩토리얼 C++ (0) 2023.10.23