Baekjoon/Gold
C++ / 백준 / 2448 / 별 찍기 - 11
GitHubSeob
2021. 9. 1. 22:35
문제
https://www.acmicpc.net/problem/2448
2448번: 별 찍기 - 11
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
www.acmicpc.net
문제풀이
N=3일 때 모양이다.
N이 몇이든 이 모양이 기본이 되는 문제이다.
Nx(N*2-1) 행렬이다.
N=3일 때 y=0, x=3-1인 부분이 기준점이 되므로
[y][x] = *, [y+1][x-1], [y+1][x+1] = *, [y+1][x-2] ~ [y+1][x+2] = *이라는 기본 형태를 잡아준다.
N=6일 때 모양이다.
Nx(N*2-1) 행렬이다.
기준점이 (0, N-1)이고, 또 다른 점은 (0+3, N-4), (0+3, N+4)이다.
N=12일 때 모양이다.
기준점이 9개가 있다.
이 예제를 보면 재귀를 이용해서 각각 기준점을 잡아주고, 기준점일 때 해당 좌표에 기본 형태를 넣어주면 된다.
함수에 N, 0, N-1을 집어넣어 맨 윗줄 기준점을 잡고, N/2를 하여 (0+6, 11-6=5), (0+6, 11+6=17) 두 기준점과, (0, 11) 기준점을 다시 잡는다.
이 그림에서 함수를 실행하면 빨간 부분을 처음에 잡고, (0, 11) 기준점을 다시 잡아 그다음 기준점인 주황 부분을 잡는다.
더 이상 잡을 기준이 없을 때 N=3일 때, 저 형태를 벡터에 집어넣는다.
코드
#include <iostream>
#include <vector>
using namespace std;
vector<vector<char>>star;
void Make_Star(int N, int y, int x) {
if (N == 3) {
star[y][x] = '*';
star[y + 1][x - 1] = star[y + 1][x + 1] = '*';
for (int idx = 0; idx < 5; ++idx)
star[y + 2][x - 2 + idx] = '*';
}
else {
Make_Star(N / 2, y, x);
Make_Star(N / 2, y + N / 2, x - N / 2);
Make_Star(N / 2, y + N / 2, x + N / 2);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N = 0;
int y = 0, x = 0;
cin >> N;
star = vector<vector<char>>(N, vector<char>(N * 2 - 1, ' '));
Make_Star(N, 0, N - 1);
for (y = 0; y < N; ++y) {
for (x = 0; x < N * 2 - 1; ++x) {
cout << star[y][x];
}
cout << '\n';
}
}