본문 바로가기
문제 풀이/백준(BOJ)

[C] 백준 2447번 : 별 찍기 - 10

by 희조당 2021. 3. 27.
728x90

www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

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

www.acmicpc.net


문제 접근

 1. 3의 7제곱인 2187 크기의 배열을 초기화 한다.

 2. 구멍이 뚫리는 위치는 입력값 n(3의 제곱수)에 대해서 n/3부터 n/3개

 (ex. n이 9이면 출력은 9x9 크기에서 3부터 3개 즉, 3x3 위치부터 5x5 위치까지 뚫림)

 3. 입력값 n의 n/3이 1이 아니면 다시 별을 찍는 함수를 불러온다.

느낀점

 처음에 접근이 어려워서 다른 분들의 코드를 살펴보았다. 이해가 어려웠다는 점과, 대부분 별을 찍으려고 하지 빈칸을 뚫으려는 코드는 하나도 없어 내가 빈칸을 뚫는 코드를 만들어 보았다. 사실 코드가 그렇게 실용적이지 않아 시간 복잡도가 사실 많이 크다 (2187 * 2187 * (n/3) * (n/3)회 반복....). 3의 7제곱이 아니라 12제곱만 되었어도 시간초과가 났을 코드이다. 하지만 내가 스스로 했다는 점에서 뿌듯하고 맞추기까지 했다. 다른 분들의 코드를 통해 알고리즘을 다시 공부해보거나 이 코드를 발전시켜봐야겠다. 

코드

#define _CRT_NO_SECURE_WARNING_
#include <stdio.h>
#define size 2188

char mat[size][size];

void star(int n) {
	int div = n / 3;
	for (int x = div;x < size - 1;x += n) {
		for (int y = div;y < size - 1;y += n) {
			for (int w = 0;w < div;w++) {
				for (int z = 0;z < div;z++) {
					mat[x+w][y+z] = ' ';
				}
			}
		}
	}
	if (div != 1) star(div);
}

int main() {
	for (int i = 0; i < size;i++) {
		for (int j = 0;j < size;j++) {
			mat[i][j] = '*';
		}
	}
	int n;
	scanf("%d", &n);
	star(n);
	for (int i = 0;i < n;i++) {
		for (int j = 0;j < n;j++) {
			printf("%c", mat[i][j]);
		}
		printf("\n");
	}

	return 0;
}

'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글

[C] 백준 2231번 : 분해합  (0) 2021.04.06
[C] 백준 2798번 : 블랙잭  (0) 2021.04.03
[C] 백준 10870번 : 피보나치 수 5  (0) 2021.03.24
[C] 백준 10872번 : 팩토리얼  (0) 2021.03.24
[C] 백준 1002번 : 터렛  (0) 2021.03.23

댓글