피너클의 it공부방
백준 2448 별 찍기 - 11 (c++) : 피너클 본문
728x90
반응형
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 = 3 * 2가 주어지면
*
* *
*****
* *
* * * *
***** *****
위의 별이 출력되야 하고 n = 3 * 4가 주어지면
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
위의 별이 출력되야한다. 이전 별과 같은 크기로 왼쪽과 오른쪽에 놓으면 된다.
cin >> n;
memset(star, ' ', sizeof(star));
for (int i = 0; i < 5; i++) star[0][n + i - 2] = p1[i];
for (int i = 0; i < 5; i++) star[1][n + i - 2] = p2[i];
for (int i = 0; i < 5; i++) star[2][n + i - 2] = p3[i];
값을 입력받은 다음 맨 처음 별의 상태를 만든다. 이때 별의 맨위 꼭짓점을 n으로 둔다.
char p1[] = { " * " };
char p2[] = { " * * " };
char p3[] = { "*****" };
p1, p2, p3배열이다.
solve(3, n - 3, 1, 0);
solve(3, n + 3, 1, 1);
이제 solve함수를 돌린다. solve(현재 y, 현재 x, 몇번째 별인지, 왼쪽이면 0, 오른쪽이면 1)로 전달받는다.
void solve(int y, int x, int num, int rl) {
if (y >= n) return;
int a = 3 * pow(2, num - 1) - 1;
int b = 3 * pow(2, num) - 1;
for (int i = 0; i <= a + 1; i++) {
for (int j = 0; j <= b; j++) {
star[y + i][x - a + j] = star[i][n - a + j];
}
}
if (rl == 1) {
solve(y + a + 1, n - 6 * pow(2, num - 1), num + 1, 0);
solve(y + a + 1, n + 6 * pow(2, num - 1), num + 1, 1);
}
}
solve함수다. 단순 구현이어서 딱히 설명하기가 애매하다.
오른쪽 아래에 별을 만든 다음에 아래 별을 만든다.
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
int n;
char star[10000][10000];
char p1[] = { " * " };
char p2[] = { " * * " };
char p3[] = { "*****" };
void solve(int y, int x, int num, int rl) {
if (y >= n) return;
int a = 3 * pow(2, num - 1) - 1;
int b = 3 * pow(2, num) - 1;
for (int i = 0; i <= a + 1; i++) {
for (int j = 0; j <= b; j++) {
star[y + i][x - a + j] = star[i][n - a + j];
}
}
if (rl == 1) {
solve(y + a + 1, n - 6 * pow(2, num - 1), num + 1, 0);
solve(y + a + 1, n + 6 * pow(2, num - 1), num + 1, 1);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
memset(star, ' ', sizeof(star));
for (int i = 0; i < 5; i++) star[0][n + i - 2] = p1[i];
for (int i = 0; i < 5; i++) star[1][n + i - 2] = p2[i];
for (int i = 0; i < 5; i++) star[2][n + i - 2] = p3[i];
solve(3, n - 3, 1, 0);
solve(3, n + 3, 1, 1);
for (int i = 0; i < n; i++) {
for (int j = 1; j < 2 * n; j++) {
cout << star[i][j];
}
cout << '\n';
}
}
전체코드다.
728x90
반응형
'백준' 카테고리의 다른 글
백준 2638 치즈 (c++) : 피너클 (0) | 2022.07.31 |
---|---|
백준 25238 가희와 방어율 무시 (c++) : 피너클 (0) | 2022.07.31 |
백준 5639 이진 검색 트리 (c++) : 피너클 (0) | 2022.07.30 |
백준 13172 Σ (c++) : 피너클 (0) | 2022.07.30 |
백준 17144 미세먼지 안녕! (c++) : 피너클 (0) | 2022.07.29 |
Comments