본문 바로가기
백준/분할정복

백준 2447. 별찍기 10

by 29살아저씨 2021. 9. 6.
반응형

🅰 백준 2447. 별찍기 10

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

✏️ 문제 풀이

  • N크기만큼 2차원 배열을 생성하여 재귀 규칙에 따라 데이터를 넣은 후 출력을 해주었다.
  • 규칙을 보면 다섯번째 순서일 때 공백칸을 출력하므로 count와 boolean형 check변수를 이용하여 가운데 빈 부분을 체크해주었다.
  • 재귀 수행 후 기저조건으로는 check = true일 때(" "), N==1일때(*)를 지정해주었다.

✏️ 소스코드

package divideandconquer;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Main_실버1_2447_별찍기10 {
	private static StringBuilder sb = new StringBuilder();
	private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	private static char map[][];

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		map = new char[N][N];
		star(N, 0, 0, false);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				bw.append(map[i][j]);
			}
			bw.append('\n');
		}
		bw.flush();
		bw.close();
	}

	private static void star(int N, int x, int y, boolean check) throws IOException {
		if (check) {
			for (int i = x; i < x + N; i++) {
				for (int j = y; j < y + N; j++) {
					map[i][j] = ' ';
				}
			}
			return;
		}
		if (N == 1) {
			map[x][y] = '*';
			return;
		}
		int count = 0;
		int size = N/3;
		for (int i = x; i < x + N; i += N / 3) {
			for (int j = y; j < y + N; j += N / 3) {
				count++;
				if (count == 5) {
					star(size,i,j,true);
				}else {
					star(size,i,j,false);
				}
			}
		}
	}
}

 

✅ 후기

  • 간단한 재귀만 풀다가 심화적인 부분을 들어가니 실버라도 쉽지가 않았다. 재귀로 생각하는 힘을 길러야겠다.
반응형

'백준 > 분할정복' 카테고리의 다른 글

백준 11729. 하노이탑  (0) 2021.09.06
백준 1780. 종이의 개수  (0) 2021.09.06
백준 2448. 별찍기 11  (0) 2021.09.06
백준 11728. 배열합치기  (0) 2021.09.06
백준 10816. 숫자카드2  (0) 2021.09.06

댓글