반응형

 

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

 

서론

 

스스로 해결하지 못한 문제.

출력결과를 배열에 넣는다는 생각을 못했고, 바로 출력하려고 시도하다 못풀었다.

그런데 바로 출력해서 푸신 분들도 있다. 존경스럽다.

아래 코드는 배열에 넣는 방식으로 풀었다.

 

 

풀이

 

n이 3일때의 출력결과는 다음과 같다.

3*3 행렬에서 정중앙(1행 1열)만 공백처리 한다.

 

 

* * *
*   *
* * *

 

 

n이 9일때의 출력결과는 다음과 같다.

n이 3인 출력결과가 정중앙을 제외한 8칸에 들어가므로

n이 3일때와 마찬가지로 정중앙만 공백처리 하면 된다.

즉 n이 커지더라도 정중앙만 공백처리하면된다.

그리고 n이 9일때 각 칸은 n이3일때의 9칸 전부를 포함하는데, 이는 재귀로 만들 수 있다.

 

 

***

* *

***

***

* *

***

***

* *

***

***

* *

***

 

***

* *

***

***

* *

***

***

* *

***

***

* *

***

 

 

구현

 

//c++

#include <iostream>

using namespace std;

int map[2188][2188];

void rec(int n, int y, int x) {
	int nn = n / 3;
	if (n == 1) { 
		map[y][x] = 1; 
		return;
	}

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (i != 1 || j != 1) rec(nn, y + nn * i, x + nn * j);
		}
	}

	return;
}

int main() {
	int n;
	cin >> n;
	rec(n, 0, 0);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (map[i][j] == 1) cout << "*";
			else cout << " ";
		}
		cout << endl;
	}
}