Algorithm

백준 2447번 <별 찍기 - 10>

seungh2 2022. 8. 23. 16:54

백준 알고리즘 2447번

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net


2447번

재귀적인 패턴으로 별을 찍어보자. 


문제 해결

재귀 함수 paint()를 이용하여 풀었다. 

 

paint(int i, int j, int len)

  • 패턴의 가장 왼쪽 상단 ( i, j )와 패턴의 길이를 len을 파라미터로 받았다.
  • 들어온 패턴을 9등분하여 재귀적으로 paint()를 호출해야 한다. 이때, 가운데는 별을 찍지 않기 때문에 호출하지 않는다. 따라서 8번의 재귀 호출을 한다.
  • 기저 조건은 len이 3일 때로, 주어진 입력에 맞게 찍어주었다.

코드

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	static char[][] paper;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		paper = new char[N][N];
		for(int i = 0; i < N; i++) {
			Arrays.fill(paper[i], ' ');
		}
		paint(0, 0, N);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb.append(paper[i][j]);
			}
			sb.append("\n");
		}
		System.out.println(sb.toString());

	}

	public static void paint(int i, int j, int len) {
		if (len == 3) {
			basic(i, j);
			return;
		}
		int nlen = len / 3;
		paint(i, j, nlen);
		paint(i, j + nlen, nlen);
		paint(i, j + nlen * 2, nlen);
		paint(i + nlen, j, nlen);
		paint(i + nlen, j + nlen * 2, nlen);
		paint(i + nlen * 2, j, nlen);
		paint(i + nlen * 2, j + nlen, nlen);
		paint(i + nlen * 2, j + nlen * 2, nlen);

	}

	public static void basic(int i, int j) {
		for (int p = 0; p < 3; p++) {
			for (int q = 0; q < 3; q++) {
				if (p == 1 && q == 1) {
					continue;
				}
				paper[i + p][j + q] = '*';
			}
		}
	}

}

결과

 


처음에 틀렸는데 이클립스에서는 new char[N][N]을 했을 때 자동으로 ' '(공백)을 넣어줘서 출력이 잘 나왔는데 채점 시스템에서는 그렇지 않다고 해서 Arrays.fill()을 이용하여 모두 ' '을 넣어준 후 제출하니 맞았다.

728x90