View
https://www.acmicpc.net/problem/2447
문제 요약
재귀적인 패턴으로 별을 찍어 보자. 입력되는 N은 3의 거듭제곱이고, 출력되는 패턴은 공백으로 채워진 가운데의 (N/3)*(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.
문제 해결 아이디어
크게 보면 계속해서 3*3의 반복을 돌면 된다. 그러면서 가운데는 비워주고, 가운데가 아니라면 계속해서 옆으로 밑으로 보내서 N==1이 되는 순간 별을 찍을 수 있게 한다.
재귀함수의 파라미터로 r, c, N을 받는데, r과 c는 3*3의 반복을 돌면서 별이 찍혀야 하는 부분(가운데를 제외한 남저ㅣ 부분)으로 변경해 준다.
처음에는 배열을 초기화하고 가운데를 만날 때마다 공백 찍고, 아닌 경우에는 별을 찍는 식으로 했는데 그렇게 되면 공백 처리가 제대로 안돼서... 초기화할 때 처음부터 공백으로 초기화를 해 주었다.
완성된 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_BOJ_2447_별찍기 {
static StringBuilder sb;
static String[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
sb = new StringBuilder();
arr = new String[N][N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
arr[i][j] = " ";
print(0, 0, N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
sb.append(arr[i][j]);
sb.append("\n");
}
System.out.println(sb);
}
public static void print(int r, int c, int N) {
if (N == 1) {
arr[r][c] = "*";
return;
}
// 크게 보면 총 [3][3]의 반복을 돌면 된다
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) // 가운데는 비워주고
continue;
else // 아닌 부분은 옆으로 밑으로 보낸다
print(r + i * (N / 3), c + j * (N / 3), N / 3);
}
}
}
}
'Level-Up > 알고리즘' 카테고리의 다른 글
[백준] 14501. 퇴사 - 실버5 (0) | 2021.08.18 |
---|---|
[백준] 9012. 괄호 - 실버4 (0) | 2021.08.18 |
[백준] 9095. 1, 2, 3 더하기 - 실버3 (0) | 2021.08.07 |
[백준] 2503. 숫자 야구 - 실버5 (0) | 2021.08.07 |
[백준] 2309. 일곱 난쟁이 - 브론즈2 (0) | 2021.08.07 |
reply