알고리즘/백준

백준 2447번 별 찍기 - 10 자바 Java

김발자~ 2022. 10. 6. 21:41
반응형

백준 10단계 5번 문제 - 2447 별 찍기 - 10

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

 

 


10. 재귀 (5) 백준 2447번 문제 별 찍기 - 10


문제


 

 

 

 

 


과정 생각해보기


 

이 예제에서 볼 수 있듯이 가운데가 뚫린 정사각형더 큰 크기의 정사각형이, 또 더 큰 크기의 정사각형이 이를 감싸는 구조다

가운데에 입력한 숫자 n/3 크기의 공백이 있고, 이것들을 작은 정사각형들이 감싼다

예제는 27을 입력했으므로 27/3, 즉 한 변이 별 9개로 이루어진 정사각형 공백을 감싸고 있다

 

 

 


정답 인정 코드


 

https://st-lab.tistory.com/95

이 블로그를 참고했다

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
    static char[][] arr;
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.parseInt(br.readLine());
        arr = new char[n][n];
        
        star10(00, n, false);
        
        for(int i = 0; i < n; i++) {
            bw.write(arr[i]);
            bw.write("\n");
        }
        bw.flush();
        bw.close();
    }
    
    static void star10(int x, int y, int n, boolean blank) {
        if(blank) {    //공백이라면
            for(int i = x; i < x+n; i++) {
                for(int j = y; j < y+n; j++) {
                     arr[i][j] = ' ';
                }
            }
            return;
        }
        
        if(n == 1) {    //9칸씩 나누다가 더이상 쪼갤 수 없다면
            arr[x][y] = '*';    //별 찍기 시작
            return;
        }
        
        int size = n/3;
        int count =0;
        for(int i = x; i < x+n; i+=size) {        //입력한 size 덩어리별로 움직인다
            for(int j = y; j < y+n; j+=size) {
                count++;
                if(count == 5) {    //9칸씩 나누므로 매번 공백은 가운데인 5번째에서 나타난다
                    star10(i, j, size, true);    //true = blank
                }else {
                    star10(i, j, size, false);
                }
            }
        }
    }
 
}
cs

 

최대한 이해한대로 주석을 달려고 했다

혹시 잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다~

 

 

 


직후 백지 복습


 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
    static char[][] arr;
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int n = Integer.valueOf(br.readLine());
        arr = new char[n][n];
        
        star10(00, n, false);
        
        for(int i = 0; i < n; i++) {
            bw.write(arr[i]);
            bw.write('\n');
        }
        bw.flush();
        bw.close();
    }
    
    static void star10(int x, int y, int n, boolean blank) {
        if(blank) {
            for(int i = x; i < x+n; i++) {
                for(int j = y; j < y+n; j++) {
                    arr[i][j] = ' ';
                }
            }
            return;
        }
        
        if(n == 1) {
            arr[x][y] = '*';
            return;        //★ if문 밖에 return 씀
        }
        
        int size = n/3;
        int count = 0;
        for(int i = x; i < x+n; i += size) {
            for(int j = y; j < y+n; j += size) {
                if(count == 5) {
                    star10(i, j, n, true);     //★ i, j 대신 x, y 씀
                } else {
                    star10(i, j, n, false);    //★ i, j 대신 x, y 씀
                }
            }
        }
    }
 
}
cs

 

자꾸 이상한 실수 하는 중..

덤벙대지 않게 조심해야겠다

 

 

 


설계를 어떻게 해야 할지 한참 고민하다가 구글링 여럿 해보면서 블로그를 참고했다

재귀파트는 나한테 특히 어렵게 느껴지는 것 같아서 이렇게 하는 게 맞는 건지 의문이기도 하다

하지만 일단 내가 할 수 있는 최선이라고 생각하니까 계속 해보려고 한다

열심히 해야 나중에 그만두더라도 후회가 없다고 하니까~ 그리고 아무리 헛짓거리라고 해도 결국 도움 안 되는 건 없었다

재귀 한 문제 남았으니까 파이팅!

반응형