GitHub 자세히보기

Algorithm/BOJ

[백준] 2447번 별찍기10 for JAVA

devdange 2022. 1. 1. 21:02

문제설명

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

 

제한사항

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

 

출력

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

 

문제풀이

재귀함수 활용

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

public class Main {
	static char[][] arr;
	static int N;
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		arr = new char[N][N];
		star(N, 0, 0);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb.append(arr[i][j] != ' ' ? '*' : ' ');
			}
			sb.append("\n");
		}
		bw.write(sb.toString());
		bw.flush();
		bw.close();
	}

	private static void star(int n, int startR, int startC) {
		if (n == 1)
			return;
		
		for (int i = startR; i < startR + n; i++) {
			for (int j = startC; j <  startC + n; j++) {
				if (i >= startR+ n / 3 && i < startR+n / 3 * 2 && j >= startC+ n / 3 && j < startC+ n / 3 * 2) {
					arr[i][j] = ' ';
				}
			}
		}
		if (startR + n == N && startC + n == N) {
			star(n / 3, 0, 0);
			return;
		} else if (startC + n == N) {
			star(n, startR+n, 0);
			return;
		} else {
			star(n, startR, startC+n);
			return;
		}
	}
}

 

문제 바로가기

 

2447번: 별 찍기 - 10

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

www.acmicpc.net