728x90
문제출처: https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
1. 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
void star(int i, int j, int n) {
if (i % 3 == 1 && j % 3 == 1) {
printf(" ");
return;
}
else if (n == 1) {
printf("*");
return;
}
else star(i / 3, j / 3, n / 3);
//N*N 의 배열 만들어주고 배열에 공백으로 채움
// 3의 제곱값을 입력 받고 3으로 나눠서 1이 될때까지 나눠준다.
// 1이 될때까지 나눈 값들은 *을 입력
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
star(i, j, n);
}
printf("\n");
}
return 0;
}
|
cs |
2. 해결방법
그림을 그려서 직접 규칙을 찾아서 풀었다.
3*3 배열의 경우 가운데를 비워줘야한다. 9*9 배열의 경우에 공백을 출력해야하는 좌표를 찾아보면, 3*3과 마찬가지로 가운데가 빈칸이며, 중앙에 3*3으로 크게 빈 부분이 나타나는 규칙을 가진다. 좌표로 나타내면
(1,1),(1,4),(1,7)
(3,3), (3,4), (3,5), (4,3), (4,4), (4,5), (5,3), (5,4), (5,5)
(7,1),(7,4),(7,7)
이다. 즉, 빈칸으로 출력해야하는 조건은 (i%3)==1&&(j%3)==1 이다.
3. 느낀점
재귀는 어렵다.. 규칙을 찾는 것이 생각보다 까다로웠고, 분할정복 알고리즘을 사용해야한다는 것을 검색을 통해서 알게되었던 문제였다. 공부를 더 많이 해야한다...
728x90
'공부 자료 > 알고리즘' 카테고리의 다른 글
(C/C++) 백준 1759번 - 암호 만들기 (0) | 2021.07.19 |
---|---|
(C/C++) 백준 6603번 - 로또 (0) | 2021.07.19 |
(C/C++) 백준 17478번 - 재귀함수가 뭔가요? (0) | 2021.07.19 |
(C/C++) 백준 1182번 - 부분 수열의 합 (0) | 2021.07.16 |
[알고리즘] 깊이 우선 탐색(DFS) (0) | 2021.07.15 |