본문 바로가기
백준

[2448] 별 찍기 - 11

by kmyobin 2022. 11. 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

재귀 문제이다.

 

4시간동안 삽질하다가 풀었다.

비어있는 공간을 중심으로 코드를 짜보기도 하고, '*'을 중심으로 코드를 짜보기도 했는데, 결국은 다 구현하지 못했다.

 

 

최후의 방법은 삼각형 맨 위의 꼭짓점의 좌표 정보를 담고 재귀를 진행하는 것이었다.

말보다는 그림이 더 편할 것 같다!

삼각형 맨 위의 꼭짓점에서 위쪽/왼쪽/오른쪽의 삼각형이 다시 재귀함수로 들어간다.

이 역시 맨 위의 꼭짓점 좌표 정보가 들어간다.

 

파란색 동글 -> 하늘색 동글 이런식으로 파고들다가 특정 조건이 되면 배열에 '*'를 담는다.

 

 

말로 설명하기 힘들어서 코드로 대체한다..

#include <iostream>
using namespace std;

int N;
char A[3072][6143];

void star(int x, int y, int exponent) {
	if (exponent < 1) {
		A[y][x] = '*';
		A[y + 1][x - 1] = '*'; A[y + 1][x + 1] = '*';
		for (int i = x - 2; i <= x + 2; i++) A[y + 2][i] = '*';
		return;
	}
	int p = 1; exponent--; // 지수 감소
	for (int i = 0; i < exponent; i++) {
		p = p << 1; // 2^exponent를 p에 저장
	}
	star(x, y, exponent); // 위
	star(x - 3 * p, y + 3 * p, exponent); // 왼쪽
	star(x + 3 * p, y + 3 * p, exponent); // 오른쪽
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N;
	
	int a = N / 3;
	int q = 1;
	for (int i = 0;; i++) {
		if (q == a) { a = i; break; }
		q = q << 1; // 2배
	}
	star(N - 1, 0, a);

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 2 * N - 1; j++) {
			if (A[i][j] == '*') printf("*");
			else printf(" ");
		}
		printf("\n");
	}
}

'백준' 카테고리의 다른 글

[2263] 트리의 순회  (0) 2022.11.17
[1891] 사분면  (0) 2022.11.14
[1074] Z  (0) 2022.11.12
[2630] 색종이 만들기  (0) 2022.11.08
[1406] 에디터  (0) 2022.11.07

댓글