문제요약:
재귀함수를 이용하여 특정 규칙의 별을 찍어보자.
N이 3의 거듭제곱(3, 9, 27, 81, ...)이라고 할 때,
크기 N의 패턴은 길이 N짜리 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고,
가운데를 제외한 모든 칸에 별이 하나씩 있는 길이 N짜리 정사각형이다.
제약:
시간 제한 1초, 메모리 제한 256MB
N은 3의 거듭제곱이다. (N = 3^k)
이 때, 1 <= k < 8 이다.
예제 1 입력. | 예제 1 출력. |
3 | *** * * *** |
예제 2 입력. | 예제 2 출력. |
9 | ********* * ** ** * ********* *** *** * * * * *** *** ********* * ** ** * ********* |
정답코드:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include <iostream>
#define MAX_LENGTH (6561)
using namespace std;
// "*"을 출력할 지 여부를 저장할 boolean array 생성.
bool aabStars[MAX_LENGTH + 1][MAX_LENGTH + 1] = { false, };
void checkStars(int X, int Y, int N) // 위치, 네모의 크기를 받는 재귀함수.
{
if (N == 1)
{
// N의 크기가 1이면, "*"을 출력하겠다는 표시를 하고 넘어감.
aabStars[X][Y] = true;
return;
}
else if (N <= MAX_LENGTH)
{
// N의 크기가 1이 아닌 경우, 루프를 돌면서 출력.
// - 규칙 1. N의 크기가 몇이든, 3x3 번 재귀함수를 호출한다.
// - 규칙 2. 3x3번 호출 중 중간은 재귀함수를 호출하지 않는다.
for (int i = X; i < (X + N); i += (N / 3))
{
for (int j = Y; j < (Y + N); j += (N / 3))
{
if ((i == (X + (N / 3))) && (j == (Y + (N / 3))))
{
// 중앙부에 대해서는 출력하지 않음.
continue;
}
else
{
// 이외는 재귀함수 호출.
checkStars(i, j, N / 3);
}
}
}
}
else
{
return;
}
}
int main()
{
int N;
cin >> N;
// 재귀함수를 호출하여 "*"을 출력할 대상을 체크.
checkStars(0, 0, N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
// "*" 표시를 해야한다고 표시되어 있는 경우, 출력.
if (aabStars[i][j] == true)
{
cout << '*';
}
else
{
cout << ' ';
}
}
// 한 행이 끝나면 개행 출력.
cout << '\n';
}
}
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘] 백준 4948번 "베르트랑 공준" (C/C++) - Don 임베디드 (26) | 2022.04.07 |
---|---|
[알고리즘] 백준 11729번 "하노이 탑 이동 순서" (C/C++) - Don 임베디드 (30) | 2022.04.06 |
[알고리즘] 백준 11399번 "ATM" (C/C++) - Don 임베디드 (18) | 2022.04.04 |
[알고리즘] 백준 10870번 "피보나치 수 5" (C/C++) - Don 임베디드 (20) | 2022.04.03 |
[알고리즘] 백준 11650번 "좌표 정렬하기" (C/C++) - Don 임베디드 (18) | 2022.04.01 |