넘치게 채우기

[BOJ] 2448 - 별 찍기 - 11 본문

PS/BOJ

[BOJ] 2448 - 별 찍기 - 11

riveroverflow 2024. 10. 27. 17:09
728x90
반응형

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

BOJ - 별 찍기 - 11

문제 유형: 재귀, 구현

문제 난이도: Gold IV

시간 제한: 1초

메모리 제한: 256MB

 

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

 

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

풀이

 

재귀적인 방법, 반복적인 방법 모두 가능하다.

 

반복적인 풀이:

shape = {

"  *  "

" * * "

"*****"

}

를 처음에 저장해놓고, shape의 크기가 n이될때까지 계속해서 크기를 증식시킨다.

매번 길이가 두 배가 되는데,

shape[i + 기존높이] = shape[i] + " " + shape[i]의 꼴로 다음 새로운 파트를 만들 수 있다.

그리고, 양쪽 공백을 채우기 위해, shape[i] = (" "를 기존높이번) + shape[i] + (" "를 기존높이번) 한 것을 저장해놓으면 된다.

 

최종적인로 완성된 shape를 출력한다.

 

재귀적인 풀이:

n * 2n-1짜리 배열을 미리 만들어놓는다.

draw_triangle(n, x, y, shape)를 호출한다. 처음에는 전체 높이의 첫 줄의 가운데이므로, draw_triangle(n, 0, n-1, shape)를 호출한다.

base case:: n이 3이면, 현재 좌표를 기준으로 기본 삼각형을 만든다. 현재 좌표, 그 다음 행의 +-1열, 그 다음행의 -2부터+2열까지 전부 '*'으로 채운다.

그게 아니라면, 분할해서 재귀 호출한다.

절반 값인 half = n/2를 구해서,

draw_triangle(half, x, y, shape), 

draw_triangle(half, x + half, y - half, shape), 

draw_triangle(half, x + half, y + half, shape)를 호출한다.

각각 위쪽, 왼쪽, 오른쪽 부분삼각형을 구성하라는 의미이다.

 

최종적으로 완성된 shape를 출력한다.

 

코드

C++

 

반복 풀이

#include <bits/stdc++.h>

using namespace std;

int len;
void scaleup(int height, vector<string> &shape) {
  for (int i = 0; i < height / 2; ++i) {
    string temp = "";
    temp += shape[i] + " " + shape[i];
    shape.emplace_back(temp);
    shape[i] = string(height / 2, ' ') + shape[i] + string(height / 2, ' ');
  }
}

void solve(int n) {

  vector<string> shape = {"  *  ", " * * ", "*****"};

  int height = 6;
  while (height <= n) {
    scaleup(height, shape);
    height *= 2;
  }
  for (int i = 0; i < n; ++i) {
    cout << shape[i] << "\n";
  }
}

int main(int argc, char *argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  int n;
  cin >> n;
  len = n * 2 - 1;
  solve(n);
  return 0;
}

 

재귀 풀이

#include <bits/stdc++.h>

using namespace std;

void draw_triangle(int n, int x, int y, vector<string> &shape) {
  if (n == 3) {
    shape[x][y] = '*';
    shape[x + 1][y - 1] = '*';
    shape[x + 1][y + 1] = '*';
    for (int i = -2; i <= 2; i++)
      shape[x + 2][y + i] = '*';
    return;
  }

  int half = n / 2;
  draw_triangle(half, x, y, shape);
  draw_triangle(half, x + half, y - half, shape);
  draw_triangle(half, x + half, y + half, shape);
}

void solve(int n) {
  vector<string> shape(n, string(2 * n - 1, ' '));

  draw_triangle(n, 0, n - 1, shape);

  for (int i = 0; i < n; ++i) {
    cout << shape[i] << "\n";
  }
}

int main() {
  int n;
  cin >> n;
  solve(n);
  return 0;
}
 
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 1916 - 최소비용 구하기  (0) 2024.10.29
[BOJ] 9663 - N-Queen  (0) 2024.10.28
[BOJ] 1149 - RGB거리  (0) 2024.10.26
[BOJ] 16953 - A → B  (0) 2024.10.25
[BOJ] 15663 - N과 M(9)  (0) 2024.10.25