Notice
Recent Posts
Recent Comments
Link
250x250
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

피너클의 it공부방

백준 2447 별 찍기 - 10 (c++) : 피너클 본문

백준

백준 2447 별 찍기 - 10 (c++) : 피너클

피너클 2022. 8. 19. 14:33
728x90
반응형

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

구현문제다.

int n;
char stars[10001][10001];
char first[3][3] = {{'*', '*', '*'},
                    {'*', ' ', '*'},
                    {'*', '*', '*'}};

전체 별을 담을 stars와 초기 별의 모음인 first를 준비해준다.

memset(stars, ' ', sizeof(stars));

for(int i = 0; i < 3; i++)
    for(int j = 0; j < 3; j++)
        stars[i][j] = first[i][j];

cin >> n;
solve(3, 3, 3);

for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++) cout << stars[i][j];
    cout << '\n';
}

그후 메인함수에소

stars를 ' '로 초기화하고 0~3에 first를 집어넣은뒤 n을 입력받고 solve를 돌린다.

그후 n범위안의 stars를 출력하면된다.

n=3 일때 별의 모양이다. n=9가 입력된다면

위를 출력해야한다. n=3이 여러개가 붙은걸 확인할수있다.

이전에 만들어진 별들을 위와 같이 이어붙일것이다.

좌측 상단의 별 모음의 좌표가 0~y, 0~x라고 한다면 그 옆쪽에 있는 별 모음의 좌표는 0~y, x~2x이다.

이것을 총 7개 붙이면 된다.

void solve(int y, int x, int num) {
	if (num == n) return;

	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[i][x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[i][2 * x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[y + i][j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[y + i][2 * x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][2 * x + j] = stars[i][j];
		}
	}
	solve(3 * num, 3 * num, num * 3);
}

solve함수다. num이 n과 같아지면 함수를 종료한다.

그후에는 이전에 만들어진 별 모음을 전부 붙이고 다음 solve함수를 실행하면 된다.

#include <iostream>
#include <cstring>

using namespace std;

int n;
char stars[10001][10001];
char first[3][3] = { { '*', '*', '*' },
{ '*', ' ', '*' },
{ '*', '*', '*' } };

void solve(int y, int x, int num) {
	if (num == n) return;

	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[i][x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[i][2 * x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[y + i][j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[y + i][2 * x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][x + j] = stars[i][j];
		}
	}
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			stars[2 * y + i][2 * x + j] = stars[i][j];
		}
	}
	solve(3 * num, 3 * num, num * 3);
}

int main() {
	memset(stars, ' ', sizeof(stars));

	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			stars[i][j] = first[i][j];

	cin >> n;
	solve(3, 3, 3);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) cout << stars[i][j];
		cout << '\n';
	}
}

전체코드다.

728x90
반응형
Comments