백준 2488 : 별 찍기 - 11

혀니앤·2021년 10월 9일
0

C++ 알고리즘

목록 보기
77/118

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

1. 접근

  • 별 찍기 문제는 중앙선을 기준으로 n을 빼고, 더한 값을 이용해서 깔끔하게 구할 수 있다.
  • 먼저 전체 삼각형 별을 중앙을 기준으로 찍어준다.
  • 이 문제의 경우, 가운데 삼각형 부분의 별을 제거하게 되는데, 꼭짓점을 기준으로 중앙선을 잡아 별을 제거해준다.
  • 별을 모두 제거했다면 삼각형을 4개로 분리하여 나머지 3개의 별의 꼭짓점을 매개변수로 하는 다음 재귀함수를 호출한다.
  • 세로의 최소 길이는 3이므로, 3보다 큰 경우에만 반복한다.

2. 나의 풀이

#include <iostream>
#include <cstring>
#define MAX 3080
using namespace std;

int n;
bool star[MAX][MAX*2];

void showStar() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n * 2-1; j++) {
			if (star[i][j])	cout << "*";
			else cout << " ";
		}
		cout << "\n";
	}
}

void check(int x, int y, int size) { //꼭짓점이 (x,y)이고 높이가 size인 삼각형
	if (size >=3) {
		int halfSpace =size/2-1; //삼각형 간격
		for (int i = x+size/2; i < x+size; i++) {
			for (int j = y - halfSpace; j <= y + halfSpace; j++) {
				star[i][j] = false;
			}
			halfSpace--; //중앙 간격을 점점 줄여가면서 삼각형을 찍는다
		}
		int newsize = size / 2;
		check(x, y, newsize); //크기를 절반으로 줄이고 새로운 꼭짓점으로 별을 제거한다. 
		check(x +newsize, y -newsize, newsize);
		check(x + newsize, y+newsize, newsize);
	}
}


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

	cin >> n;
	for (int i = 0; i < n; i++) { //삼각형 모양으로 별 찍어주기
		for (int j = n-i-1; j <n+i; j++) {
			star[i][j] = true;
		}
	}

	check(0, n-1, n);

	showStar();

	return 0;
}
profile
일단 시작하기

0개의 댓글