알고리즘/백준
백준 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개로 이루어진 정사각형 공백을 감싸고 있다
정답 인정 코드
이 블로그를 참고했다
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(0, 0, 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(0, 0, 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 |
자꾸 이상한 실수 하는 중..
덤벙대지 않게 조심해야겠다
설계를 어떻게 해야 할지 한참 고민하다가 구글링 여럿 해보면서 블로그를 참고했다
재귀파트는 나한테 특히 어렵게 느껴지는 것 같아서 이렇게 하는 게 맞는 건지 의문이기도 하다
하지만 일단 내가 할 수 있는 최선이라고 생각하니까 계속 해보려고 한다
열심히 해야 나중에 그만두더라도 후회가 없다고 하니까~ 그리고 아무리 헛짓거리라고 해도 결국 도움 안 되는 건 없었다
재귀 한 문제 남았으니까 파이팅!
반응형