작심 24/7

[백준] 2447번 별 찍기 - 10 본문

백준

[백준] 2447번 별 찍기 - 10

모닝수박 2020. 5. 20. 03:09
 

2447번: 별 찍기 - 10

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

www.acmicpc.net

분할 정복 알고리즘 문제라 한다.

분할 정복법이란 문제를 나눌 수 없을 때까지 나누어서 각각을 풀고 다시 합병하는 방법인데

N이 27이면 그림처럼 27X27 -> 9X9 -> 3X3 -> 1X1까지 분할시킬 수 있다.

 

언제가 공백인지가 관건인데 저런 식으로 공백인 좌표들을 모아 두고 규칙성을 찾아보니

N이 27인 경우엔 좌표를 9, 3, 1로 나눈 값에 %3을 한 값이 1일 때

즉, i/N/3%3, i/N/3/3%3, i/N/3/3/3%3 ... 이 1인 경우가 공백인 경우였다.

1X1로 만들기 위해 재귀 호출할 때 N을 3으로 나눈 값을 넣어주고

공백인 경우를 위해 i와 j를 각각 3으로 나눈 값을 넣어준다.

#include <iostream>
using namespace std;

void Star(int i, int j, int N) {
	if (i % 3 == 1 && j % 3 == 1) {
		cout << " ";
		return;
	}
	else if (N == 1) {
		cout << "*";
		return;
	}
	else Star(i / 3, j / 3, N / 3);
}

int main() {
	int N;
	cin >> N;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			Star(i, j, N);
		}
		cout << "\n";
	}
	return 0;
}

공백인 경우를 어떻게 처리해야할지 감도 안 잡혀서 재귀 함수 안에서 for문으로 어떻게 해보려고 했는데

3X3씩이 아니라 1X1씩 차근차근 출력한다 생각하니 좀 풀렸다.

하지만 아직 분할 정복법이 와 닿지는 않는다. 내가 재귀를 잘 쓰지 못하는 것 같다ㅜㅜ

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

[백준] 10989번 수 정렬하기 3  (0) 2020.05.22
[백준] 11729번 하노이 탑 이동 순서  (0) 2020.05.20
[백준] 1002번 터렛  (3) 2020.05.20
[백준] 1929번 소수 구하기  (2) 2020.05.20
[백준] 1193번 분수찾기  (0) 2020.05.20
Comments