본문 바로가기
프로그래밍/백준 알고리즘 코드

백준 2447번 JAVA 별 찍기 - 10 [재귀]

by 졸린이 2021. 8. 2.
반응형

까다로워 보인다.

3의 거듭제곱을 적고 그 적은 N만큼 N*N 행렬을 그린다.

3*3 사이에는 공백을 집어넣고 그 3*3행렬이 또 1이 되어 세 개가 모이면 (9*9가 되면) 가운데 3*3행렬은 공백이 된다.

다음 제곱인 27도 마찬가지 패턴으로 채워 넣으면 위와 같이 출력이 된다.

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
31
32
33
34
35
36
37
38
import java.util.Arrays;
import java.util.Scanner;
 
public class Main{
    //baekjoon 2447번 별 찍기 - 10 재귀
    public static char[][] arr;
    
    public static void solve(int n, int x, int y) {
        if(n==1) {
            arr[x][y] = '*';
            return;
        }
        int value = n/3;
        
        for(int i=0; i<3; i++) {
            for(int j=0; j<3; j++) {
                if(i==1 && j ==1)
                    continue;
                else
                    solve(value, x+(value*i), y+(value*j));
            }
        }
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        arr = new char[n][n];
        
        for(int i=0; i<n; i++) {
            Arrays.fill(arr[i], ' ');
        }
        solve(n, 00);
        for(int i=0; i<n; i++) {
            System.out.println(arr[i]);
        }
    }    
}
cs

N은 3의 배수를 입력한다.

6행 : *과 공백을 채워 넣을 이중 배열 선언

8행 : solve 함수 파라미터로 n, x, y를 받는다.

9행 : if문 n이 1이면 그 위치에 *을 입력하고 함수 종료

13행 : n(3의 제곱)을 3으로 나눠서 몫을 value에 넣는다.

17행 : i가 1, j가 1이면 가운데 공백을 넣을 위치 continue로 넘어간다.

20행 : 3으로 나눈 value, x+value*i, y+value*j 를 넘기면서 함수를 재호출한다.

 

28행 : 입력받은 n으로 arr[][]배열 크기 초기화

31행 : 배열 arr을 ' '공백으로 초기화

33행 : solve함수 호출 (n, 0, 0)

 

이해가 잘 안가는 부분이 있으면 하나씩 손코딩으로 데이터 흐름을 그리면서 하면 이해는 잘 된다.

 

반응형

댓글