[백준] 2448번 별 찍기 - 11


Divide & Conquer

문제설명

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

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

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

/assets/img/2448_example.PNG

접근

[백준] 2447번 쿼드트리 문제와 유사한 문제이다. 이번에는 사각형이 아닌 삼각형이라 많이 헷갈린다. mark라는 기본 형태를 따로 저장해두고 반복되는 세 삼각형마다의 기준점을 잡아서 재귀적으로 처리하였다. 기준점을 잡는 게 복잡해서 직접 그려보면서 확인할 수 있었다.

gongdoli 님의 블로그에 같은 방식에 대한 설명이 아주 자세히 나와있다. 참고하면 좋을 듯 하다.

코드

#include <iostream>
#define MAX_NUM 3100
using namespace std;

char stars[MAX_NUM][MAX_NUM*2];

char mark[][6] =
{
	"  *  ",
	" * * ",
	"*****"
};

void star(int x, int y, int term){
	
	if(term == 1){
		for(int i =0; i<3; i++){
			for(int j=0; j<5; j++){
				stars[x+i][y+j] = mark[i][j];
			}
		}
	}
	else{
		int new_term = term/2;
		star(x , y + 3 * term / 2, new_term);
		star(x + 3 * term / 2, y , new_term);
		star(x + 3 * term / 2, y + 3 * term, new_term);
	}
	
}

int main(){
	int n;
	cin >> n;
	
	fill(&stars[0][0],&stars[MAX_NUM-1][MAX_NUM*2],' ');
	star(1,1,n/3);
	
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n*2; j++){
			cout << stars[i][j];
		}
		cout << '\n';
	}
}

참고

BOJ #2448
[백준] 2447번 쿼드트리
gongdoli님의 글

이 글이 도움이 되셨다면 추천 클릭을 부탁드립니다 :)




© 2021. by Gyeong-Hyeon Kim

Powered by ddamddi