공부 자료/알고리즘

(C/C++) 백준 2448 - 별 찍기 11

뚜루뚜루세니 2021. 7. 21. 12:08
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. 코드

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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
//삼각형 높이 n, 삼각형 밑변 2n-1
char arr[3073][6244];
 
void star(int N, int x, int y) {
    if (N == 3) { //높이가 3인 삼각형 = 최소 삼각형 
 
        //arr[높이][밑변]
 
        //첫째줄
        arr[y][x] = '*'
        // 둘째줄
        arr[y + 1][x - 1= '*'
        arr[y + 1][x + 1= '*'
        //셋째줄
        for (int i = x - 2; i <= x + 2; i++) {
            arr[y + 2][i] ='*';
        }
        return;
    }
    star(N/ 2, x, y); //위의 삼각형 높이, 꼭대기 좌표
    star(N / 2, x - (N / 2), y + (N / 2)); // 왼쪽 아래 높이, 꼭대기 좌표
    star(N / 2, x + (N / 2), y + (N / 2)); // 오른쪽 아래 높이, 꼭대기 좌표
}
 
 
int main() {
    int N;
    scanf("%d"&N);
 
    for (int i = 0; i < N; i++) { //높이
        for (int j = 0; j < 2 * N - 1; j++) { //밑변
            arr[i][j] = ' '//배열 초기화
        }
    }
    star(N, N-10);//삼각형 높이, 삼각형 맨위 꼭짓점 좌표
    
    for (int i = 0; i < N; i++) { //높이
        for (int j = 0; j < 2 * N - 1; j++) { //밑변
            printf("%c", arr[i][j]);
        }
        printf("\n");
    }
 
}
cs

 

2. 해결과정

재귀를 이용한 별찍기 문제이다. 규칙을 살펴보면 n=3일때 삼각형이 가장 작은 최소 삼각형이고, 

n=6일때는 n=3일때 삼각형이 3개

n=12일때는 n=6일때 삼각형이 3개

n=24일때는 n=12일때 삼각형이 3개이다.

 

따라서 배열을 처음에 초기화를 시키고, star라는 재귀함수를 만들어서 삼각형의 높이, x좌표, y좌표를 제공한다.

삼각형을 쪼개면서 n==3이 되면 가장 작은 삼각형을 그리게끔 설정했다. arr[높이][밑변]이기 때문에 (y좌표,x좌표)로 생각해서 그려줘야한다. n!=3이면 계속해서 쪼개서 위의 삼각형, 왼쪽 아래 삼각형, 오른쪽 아래 삼각형으로 나눠서 또 재귀함수를 사용해서 결국 n==3일때까지 계속 쪼갠다는 것을 알 수 있다.

 

3. 느낀점

배열을 [높이][밑변]으로 해서 [y좌표][x좌표]로 생각을 해줬어야 했는데 아무 생각 없이 [x좌표][y좌표]로 놓고 출력을 시켰더니 원하는 모양이 나오지 않아 헤맸다. 별찍기 -10번 문제와 약간 유사한 느낌이여서 규칙을 찾는거는 생각보다 어렵지는 않았던 것 같다. 규칙보다 구현이 어려웠다..

728x90