본문 바로가기
알고리즘

백준 g5 2448 별 찍기 - 11 c++

by kyj0032 2024. 1. 13.

https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

 

풀이

별 찍기 - 10(https://kyj0032.tistory.com/16) 과 비슷하게 풀었다.

 

f(n) : 크기가 n인 삼각형 출력

g(n, r) : 크기가 n인 삼각형의 r번째 줄 출력

 

N==3

..*.. <- g(3, 0)

.*.*. <- g(3, 1)

***** <- g(3, 2)

 

N==9 일때는

3x3 공백 네모, f(3), 3x3 공백 네모

f(3), 1x3 공백 네모, f(3)

으로 구성되어있다. 이때 공백 네모는 (N/2)x(N/2) 넓이를 차지한다.

 

수도 코드

f(n) { // 높이가 n인 삼각형 출력
	for(0~n-1행까지)
    	g(n, r)
        \n 출력
}

g(n, r) { // 높이가 n인 삼각형의 r번째 행 출력
	if (n==3)
    	'..*..'
        '.* *.'
        '*****' 각각 출력
    	return
    
    if (r < n/2) { // 높이 N을 반으로 나눴을 때, 위쪽은 공백 네모가 존재해야함
    	공백 * N/2개 출력
        g(n/2, r) 출력
        공백 * N/2개 출력
    }
    else { // 밑 쪽은 두 개의 세모 사이에 한 줄짜리 공백이 존재해야 함
    	g(n/2, r%(n/2)) 출력
        공백 1개 출력
        g(n/2, r%(n/2)) 출력
    }
}

 

 

코드

/*boj g4 2448 별 찍기 - 11*/
#include <iostream>
using namespace std;

int N;

void g(int n, int r) {
    if (n == 3) {
        if (r == 0)
            cout << "  *  ";
        else if (r == 1)
            cout << " * * ";
        else if (r == 2)
            cout << "*****";

        return;
    }

    if (r < n / 2) { // 앞에 공백
        for (int i = 0; i < n / 2; i++)
            cout << " ";
        g(n / 2, r);
        for (int i = 0; i < n / 2; i++)
            cout << " ";
    } else {
        g(n / 2, r % (n / 2));
        cout << " ";
        g(n / 2, r % (n / 2));
    }
}

void f(int n) {
    for (int i = 0; i < n; i++) {
        g(n, i);
        cout << "\n";
    }
}

int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;

    f(N);
}

'알고리즘' 카테고리의 다른 글

백준 g4 9663 N-Queen c++  (0) 2024.01.15
백준 s3 15649 N과 M (1) c++  (0) 2024.01.15
백준 2447 g5 별 찍기 - 10 c++  (0) 2024.01.13
백준 s1 1074 Z c++  (0) 2024.01.13
백준 g5 11729 하노이 탑 이동 순서 c++  (0) 2024.01.13