View

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

문제 요약

재귀적인 패턴으로 별을 찍어 보자. 입력되는 N은 3의 거듭제곱이고, 출력되는 패턴은 공백으로 채워진 가운데의 (N/3)*(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.

 

문제 해결 아이디어

크게 보면 계속해서 3*3의 반복을 돌면 된다. 그러면서 가운데는 비워주고, 가운데가 아니라면 계속해서 옆으로 밑으로 보내서 N==1이 되는 순간 별을 찍을 수 있게 한다. 

재귀함수의 파라미터로 r, c, N을 받는데, r과 c는 3*3의 반복을 돌면서 별이 찍혀야 하는 부분(가운데를 제외한 남저ㅣ 부분)으로 변경해 준다.

 

처음에는 배열을 초기화하고 가운데를 만날 때마다 공백 찍고, 아닌 경우에는 별을 찍는 식으로 했는데 그렇게 되면 공백 처리가 제대로 안돼서... 초기화할 때 처음부터 공백으로 초기화를 해 주었다.

 

완성된 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_BOJ_2447_별찍기 {
	static StringBuilder sb;
	static String[][] arr;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		sb = new StringBuilder();
		arr = new String[N][N];

		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				arr[i][j] = " ";

		print(0, 0, N);

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++)
				sb.append(arr[i][j]);
			sb.append("\n");
		}
		System.out.println(sb);
	}

	public static void print(int r, int c, int N) {
		if (N == 1) {
			arr[r][c] = "*";
			return;
		}

		// 크게 보면 총 [3][3]의 반복을 돌면 된다
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (i == 1 && j == 1) // 가운데는 비워주고
					continue;
				else // 아닌 부분은 옆으로 밑으로 보낸다
					print(r + i * (N / 3), c + j * (N / 3), N / 3);
			}
		}
	}
}
Share Link
reply
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30