Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 2448 별 찍기 - 11 (c++) : 피너클 본문

백준

백준 2448 별 찍기 - 11 (c++) : 피너클

피너클 2022. 7. 30. 16:21
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

귀찮은 구현 문제다.

                       *                        
                      * *                       
                     *****

먼저 위의 별이 n = 3일 때이다. n = 3 * 2가 주어지면

                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****

위의 별이 출력되야 하고 n = 3 * 4가 주어지면

                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****                   
                 *           *                  
                * *         * *                 
               *****       *****                
              *     *     *     *               
             * *   * *   * *   * *              
            ***** ***** ***** *****

위의 별이 출력되야한다. 이전 별과 같은 크기로 왼쪽과 오른쪽에 놓으면 된다.

cin >> n;
memset(star, ' ', sizeof(star));
for (int i = 0; i < 5; i++) star[0][n + i - 2] = p1[i];
for (int i = 0; i < 5; i++) star[1][n + i - 2] = p2[i];
for (int i = 0; i < 5; i++) star[2][n + i - 2] = p3[i];

값을 입력받은 다음 맨 처음 별의 상태를 만든다. 이때 별의 맨위 꼭짓점을 n으로 둔다.

char p1[] = { "  *  " };
char p2[] = { " * * " };
char p3[] = { "*****" };

p1, p2, p3배열이다.

solve(3, n - 3, 1, 0);
solve(3, n + 3, 1, 1);

이제 solve함수를 돌린다. solve(현재 y, 현재 x, 몇번째 별인지, 왼쪽이면 0, 오른쪽이면 1)로 전달받는다.

void solve(int y, int x, int num, int rl) {
	if (y >= n) return;
    
	int a = 3 * pow(2, num - 1) - 1;
	int b = 3 * pow(2, num) - 1; 


	for (int i = 0; i <= a + 1; i++) {
		for (int j = 0; j <= b; j++) {
			star[y + i][x - a + j] = star[i][n - a + j];
		}
	}
	if (rl == 1) {
		solve(y + a + 1, n - 6 * pow(2, num - 1), num + 1, 0);
		solve(y + a + 1, n + 6 * pow(2, num - 1), num + 1, 1);
	}
}

solve함수다. 단순 구현이어서 딱히 설명하기가 애매하다.

오른쪽 아래에 별을 만든 다음에 아래 별을 만든다.

#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;

int n;
char star[10000][10000];
char p1[] = { "  *  " };
char p2[] = { " * * " };
char p3[] = { "*****" };

void solve(int y, int x, int num, int rl) {
	
	if (y >= n) return;
	int a = 3 * pow(2, num - 1) - 1;
	int b = 3 * pow(2, num) - 1; 


	for (int i = 0; i <= a + 1; i++) {
		for (int j = 0; j <= b; j++) {
			star[y + i][x - a + j] = star[i][n - a + j];
		}
	}
	if (rl == 1) {
		solve(y + a + 1, n - 6 * pow(2, num - 1), num + 1, 0);
		solve(y + a + 1, n + 6 * pow(2, num - 1), num + 1, 1);
	}
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	memset(star, ' ', sizeof(star));
	for (int i = 0; i < 5; i++) star[0][n + i - 2] = p1[i];
	for (int i = 0; i < 5; i++) star[1][n + i - 2] = p2[i];
	for (int i = 0; i < 5; i++) star[2][n + i - 2] = p3[i];
	solve(3, n - 3, 1, 0);
	solve(3, n + 3, 1, 1);
	for (int i = 0; i < n; i++) {
		for (int j = 1; j < 2 * n; j++) {
			cout << star[i][j];
		}
		cout << '\n';
	}
}

전체코드다.

728x90
반응형
Comments