GitHubSeob
C++ / 백준 / 2447 / 별 찍기 - 10 본문
문제
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
문제풀이
N이 9 이상일 때 0~8의 모양이다.
먼저 N이 몇이든 (1, 1), (1, 4), (1, 7), (4, 1), (4, 4), (4, 7),...
y%3=1, x%3=1인 좌표는 공백 1칸을 출력한다.
따라서 좌표를 3으로 나눈 나머지가 1이면 공백을 출력하도록 가장 먼저 조건을 걸어둔다.
그다음은 가운데 3x3 짜리 공백을 구하는 조건을 구해야 한다.
N=9이면 (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), ... (5, 5),
N=27이면 (9, 9), (9, 10), ... (10, 9), (10, 10), ... (17, 16), (17, 17)이다.
N=9이면 좌표/3%3==1일 때, N=27이면 좌표/9%3==1일 때이다.
27일 때는 좌표/9%3==1 뿐만 아니라 좌표/3%3==1인 부분도 공백을 출력해야 하므로
좌표/N%3==1이라는 조건을 걸고, N이 3 이상일 때 N을 3으로 계속 나누어 공백을 확인하는 부분을 반복해야 한다.
else if (y / N % 3 == 1 && x / N % 3 == 1) cout << ' ';
else if (N >= 3) Make_Star(N / 3, y, x);
방금 말한 부분을 조건식으로 세우면 이렇게 된다.
이 이외에는 모두 *을 표시하면 된다.
코드
#include <iostream>
using namespace std;
void Make_Star(int N, int y, int x) {
if (y % 3 == 1 && x % 3 == 1) cout << ' ';
else if (y / N % 3 == 1 && x / N % 3 == 1) cout << ' ';
else if (N >= 3) Make_Star(N / 3, y, x);
else cout << '*';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N = 0;
int y = 0, x = 0;
cin >> N;
for (y = 0; y < N; ++y) {
for (x = 0; x < N; ++x) {
Make_Star(N, y, x);
}
cout << '\n';
}
}
'Baekjoon > Silver' 카테고리의 다른 글
C++ / 백준 / 11047 / 동전 0 (0) | 2021.09.02 |
---|---|
C++ / 백준 / 11729 / 하노이 탑 이동 순서 (0) | 2021.09.02 |
C++ / 백준 / 18870 / 좌표 압축 (0) | 2021.08.31 |
C++ / 백준 / 1992 / 쿼드트리 (0) | 2021.08.25 |
C++ / 백준 / 1780 / 종이의 개수 (0) | 2021.08.24 |