Algorithm/📖Baekjoon

#10994 별 찍기 - 19

yewoneeee 2022. 6. 17. 17:57

# 문제

# 입력 및 출력


# 풀이

출력되는 별 사각형의 크기는 길이가 1부터 4씩 커지는 사각형임

정사각형의 변을 구해주고 재귀로 빈칸 자리를 확인해줌

크기가 k일 때부터 확인해서 1이 될 때까지 빈칸 자리를 확인해줌

 

아래 코드의 재귀함수의 조건문이 좀 복잡한데

첫 번째부터 네 번째까지 반복문은 i, j 값으로 빈칸을 확인하는 조건문임


n=3으로 가정하고 설명해보자

처음에 n=3 일 때 빈칸을 확인하고 그다음 n=2 일 때 빈칸을 확인해주면 됨

n=3 : (i, j) 값이 (1, 1~7), (7, 1~7), (1~7, 1), (1~7, 7) 일 때 빈칸이 됨

n=2 : (i, j) 값이 (3, 3~5), (5, 3~5), (3~5, 3), (3~5, 5) 일 때 빈칸이 됨

그 외엔 전부 * 출력

이것을 전부 조건문으로 나타내면 아래와 같음

 

n=4일 땐 n=4 빈칸 확인 후 n=3 빈칸 확인하고 그다음으로 n=2 빈칸 확인하면 됨

이것을 재귀적으로 처리해주는 것임

#include <iostream>
using namespace std;

void rec(int i, int j, int k, int s) {
	if (i == s && j >= s && j <= s + k - 3) cout << " ";
	else if (i >= s && i <= s + k - 3 && j == s) cout << " ";
	else if (i == s + k - 3 && j >= s && j <= s + k - 3) cout << " ";
	else if (i >= s && i <= s + k - 3 && j == s + k - 3) cout << " ";
	else if (k != 1) rec(i, j, k - 4, s + 2);
	else cout << "*";
}

int main() {
	int n, k = 1;
	cin >> n;
	for (int i = 1; i < n; i++) k += 4;
	for (int i = 0; i < k; i++) {
		for (int j = 0; j < k; j++) {
			rec(i, j, k, 1);
		}
		cout << "\n";
	}
}

 

 

전에 풀었던 별찍기 문제에 기반해서 이번에는 검색 도움 없이 풀어봤다^~^vv

빈칸 조건문 찾기가 진짜 힘들었다,,ㅋㅋㅋ

재귀 많이 풉시당,,