티스토리 뷰

백준 2447번 : 별 찍기 - 10

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

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

 

#include <stdio.h>

int n; //3, 9, 27, 81, 243, 729, 2187 (3^n의 최대는 2187이나 넉넉하게 잡음)
char map[7000][7000] = {0, }; //*이 담길 이차원 배열

void star(int k)
{
	if(k==n) //처음에는 출력될 영역에 다 별을 도배함
	{
		for(int i = 0; i<n; i++) {
			for(int j = 0; j<n; j++) map[i][j] = 42; // * ASCII code 42
		}
	}
	//그리고 별 제거
	int gap_i = 0; //행의 이동을 위한 변수
    
	for(int h = n/k; h>=1; h--) //행
	{
		for(int i = k/3+gap_i; i<(k/3)*2+gap_i; i++) 
		{
			int gap_j = 0; //열의 이동을 위한 변수
			for(int h2 = n/k; h2>=1; h2--) //열
			{	//공백으로 대입, 공백 ASCII code 32
				for(int j = k/3+gap_j; j<(k/3)*2+gap_j; j++) map[i][j] = 32;
				gap_j += k;	
			}
		}
		gap_i += k;
	}
	
	if(k/3 != 1) star(k/3); //재귀는 k=3일 때 완료합니다.
}

int main(void)
{
	scanf("%d", &n); //k을 입력 받음 (변수이름은 n이라고 지어버렸다)
	
	star(n); //재귀 시작
	
	for(int i = 0; i<n; i++) printf("%s\n", map[i]);
	
	return 0;
}

 

 

ex) input : 9

//star(9)

//별로 도배

*********

*********

*********

*********

*********

*********

*********

*********

*********

//별 제거

*********

*********

*********

***      ***

***      ***

***      ***

*********

*********

*********

//star(k/3)  >> star(3)

//별 제거

h와 h2은 3이 된다. 즉 3번 3번 반복 -> 9번이나 for(int j = k/3+gap_j; j<(k/3)*2+gap_j; j++) map[i][j] = 32; 을

건드리게 된다.

 

그러면...

*********

*  **  **  *   이렇게 9개의 구멍이 더 생겼다!!! (하나는 이미 가운데에 뚫려있어서 바뀌지는 않는다)

*********

***      ***

*  *      *  *

***      ***

*********

*  **  **  *

*********

 

 

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함