득이공간

[백준 C++] 2448 별 찍기 - 11 - 재귀 본문

PS/알고리즘 문제풀이

[백준 C++] 2448 별 찍기 - 11 - 재귀

쟁득 2024. 3. 7. 20:59
 

2448번: 별 찍기 - 11

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

www.acmicpc.net

#include <iostream>
using namespace std;

char Board[3072][6143];

void DrawTriangle(int N, int Row, int Col)
{
	if (N == 3)
	{
		for (int i = 0; i < N; ++i)
		{
			Board[Row + i][Col - i] = '*';
			Board[Row + i][Col + i] = '*';
		}

		for (int i = 0; i < 2; ++i)
		{
			Board[Row + N - 1][Col - i] = '*';
			Board[Row + N - 1][Col + i] = '*';
		}

		return;
	}

	DrawTriangle(N / 2, Row, Col);
	DrawTriangle(N / 2, Row + N / 2, Col - N / 2);
	DrawTriangle(N / 2, Row + N / 2, Col + N / 2);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	int N;
	cin >> N;

	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < 2 * N - 1; ++j)
		{
			Board[i][j] = ' ';
		}
	}

	DrawTriangle(N, 0, N - 1);

	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < 2 * N - 1; ++j)
		{
			cout << Board[i][j];
		}
		cout << '\n';
	}
}

 

재귀로 푸는 별찍기 문제입니다.

한 변의 크기가 큰 삼각형부터 크기가 3인 삼각형까지 내부로 쪼개서 들어간다음

크기가 3인 삼각형을 모두 그려주면 됩니다.

풀이 과정은 다음과 같습니다.

 

* 하나의 삼각형은 한 변의 크기와 위쪽 꼭지점의 위치(행, 열)로 정의

1. 큰 삼각형은 세 개의 작은 내부 삼각형으로 쪼개져서 재귀 함수 호출

1-a. 큰 삼각형의 한 변의 길이(N), 위치(Row, Col)

1-b. 위쪽 내부 삼각형의 한 변의 길이(N/2), 위치(Row, Col)

1-c. 아래 왼쪽 삼각형의 한 변의 길이(N/2), 위치 (Row + N/2, Col - N/2)

1-d. 아래 왼쪽 삼각형의 한 변의 길이(N/2), 위치 (Row + N/2, Col + N/2)

2. 현재 삼각형의 길이(N)이 3이 되면 삼각형을 배열에 저장하고 재귀 탈출

3. 저장된 배열 출력