티스토리 뷰

Q.2448 별 찍기 - 11

 

문제 :

예제를 보고 별찍는 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력 :

첫째 줄에 N이 주어진다. N은 항상 3*2^k 수이다. (3, 6, 12, 24, 48, ...) (k<=10)

 

출력 :

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

<소스 코드>

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
#include<iostream>
void star(int n, int x, int y);
 
using namespace std;
 
char arr[3072][6144];
 
int main(void)
{
    int n, i, j;
 
    cin >> n;  //N입력
 
    //배열 초기화
    //각 높이의 행의 요소들을 공백으로, 행의 끝부분만 null로 초기화한다.
    for (i = 0; i<n; i++){
        for (j = 0; j<2 * n; j++){
            if (j == 2 * n - 1)
                arr[i][j] = '\0';
            else
                arr[i][j] = ' ';
        }
    }
 
    star(n, n - 10);//삼각형의 높이와, 삼각형 맨 위 꼭지점 좌표를 매개변수로 넘긴다.
 
    //삼각형 출력
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < 2 * n - 1; j++)
        {
            cout << arr[i][j];
        }
        cout << endl;
    }
 
    return 0;
}
 
void star(int n, int x, int y)
{
    if (n == 3)//높이가 3이라면 별을 만들어 출력한다.
    {
        //별을 그린다.
        arr[y][x] = '*';
        arr[y + 1][x - 1= '*';
        arr[y + 1][x + 1= '*';
        arr[y + 2][x - 2= '*';
        arr[y + 2][x - 1= '*';
        arr[y + 2][x] = '*';
        arr[y + 2][x + 1= '*';
        arr[y + 2][x + 2= '*';
        return;
    }
    star(n / 2, x, y); // 위의 삼각형 높이와 맨 위 꼭대기 좌표를 보낸다. 
    star(n / 2, x - (n / 2), y + (n / 2)); // 왼쪽 하단 삼각형 높이와 맨 위 꼭대기 좌표를 보낸다.
    star(n / 2, x + (n / 2), y + (n / 2)); // 오른쪽 하단 삼각형 높이와 맨 위 꼭대기 좌표를 보낸다.
}
cs

 

<실행 결과>

 

<해법>

큰 삼각형에 세 개의 삼각형으로 쪼개지고, 또 그 쪼개진 삼각형안에 세 개의 삼각형으로 쪼개지는 프랙탈 구조에 관한 문제이다.

재귀 함수를 이용해서 문제를 해결하는데, 큰 별 안에 위쪽 삼각형, 왼쪽 하단의 삼각형, 오른쪽 하단의 삼각형을 그리는 3개의 함수를 재귀적으로 호출해야한다.

 

별을 그릴 때에는 삼각형 꼭대기부터 차례로 내려가며 별을 찍기 때문에 star()함수에 매개변수로 높이(n)꼭대기 별의 좌표(x, y)를 보내준다.

 

void star(int 높이, int 꼭대기 x좌표, int 꼭대기 y좌표){

if(높이가 3 이라면)

별을 그린다.

return 0;

 

star(위 삼각형의 높이, 이 삼각형의 꼭대기 x좌표, 꼭대기 y좌표)

star(왼쪽 하단 삼각형의 높이, 이 삼각형의 꼭대기 x좌표, 꼭대기 y좌표)

star(오른쪽 하단 삼각형의 높이, 이 삼각형의 꼭대기 x좌표, 꼭대기 y좌표)

 

문제 사이트 및 참고 사이트 : https://www.acmicpc.net/problem/2448

 

이번 문제는 코딩 교육 방송을 진행하시는 '밤비'님께 도움을 요청하여 해결한 문제입니다. 

밤비와 코딩 카페 해당 문제 게시물 : http://cafe.naver.com/bambiittv/1034 

     해당 문제 방송 유튜브 : https://youtu.be/WjmEVp-Lgns

 



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

댓글