백준 자바 2447 별 찍기 -10

김재동·2024년 7월 9일
0

문제

목록 보기
6/16


다음은 마지막으로 별찍기 문제다.. 개인적으로 가장 머리가 아팠다.

1/3 씩 반복해서 재귀문도 돌려야하고, 값을 찍어내기도 해야하는데, 중간중간 비워두기까지 해야한다..

package test11;

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

public class Ox11_Q5_1 {
    static int n;
    static char[][] board;
    
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());
        br.close();
        
        // 보드판 세팅, 모든 공간을 공백으로 먼저 세팅
        board = new char[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                board[i][j] = ' ';
            }
        }
        // 메서드 호출
        starFunc(0, 0, n);
        
        // 계산 된 보드판 출력세팅 , 행마다 "\n" 추가
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                sb.append(board[i][j]);
            }
            sb.append("\n");
        }
        
        System.out.println(sb.toString());
    }
    
    public static void starFunc(int x, int y, int n) {
        if (n == 1) {
            board[x][y] = '*';
            return; // 재귀함수로 return
        }
        
        int newSize = n / 3;
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (i == 1 && j == 1) {
                    continue; // 중앙은 비워둔다.
                }
                // 재귀함수 호출, 지금 검사한 메소드 x * 3, y *3 좌표
                starFunc(x + i * newSize, y + j * newSize, newSize);
            }
        }
    }
}

우선 starFunc함수는 x(헹),y(열),n 을 인자로 받는다. Z문제 는 1/2씩 반복했다면,
이 문제는 1/3씩 반복한다.
점차 반복해서 제일 작은 블럭 (0,0,3)을 만들어 주고, 해당 구문이 반복해서 전체를 채워지게끔 하는 구조이다.
그 과정에서 가운데 부분은 공백이 와야하므로 i와 j 가 같은경우엔 contine 해준다.

참.. 백트래팅은 뭔가 머리론 얼추 이해하는데 손이 안따라주는 것 같다
어렵지만 꾸준히 해야겠다! 파이팅!

profile
성장중

0개의 댓글