[Gold V] 별 찍기 - 10 - 2447
성능 요약
메모리: 68452 KB, 시간: 280 ms
분류
분할 정복, 재귀
제출 일자
2023년 11월 27일 09:25:23
문제 설명
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
1. 나눠서 생각한다. 27은 9단위로 쪼개서 9는 3단위로 쪼개서 3은 1단위로 쪼개서
2. 별은 4번 출력하면 공백을 출력 27에서도 9단위를 4번 출력하면 공백 출력
3. 배열에 담아놓고나서 출력하기
4. 효율성을 위해서 StringBuilder에 담아놓은 뒤 출력하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static char[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
map = new char[n][n];
print(n,0,0,false);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
sb.append(map[i][j]);
}
sb.append("\n");
}
System.out.println(sb.toString());
}
private static void print(int n,int x,int y,boolean space) {
if(space){
for(int i = x; i < x+n; i ++){
for (int j = y; j < y + n; j++) {
map[i][j] = ' ';
}
}
return;
}
if(n == 1){
map[x][y] = '*';
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) {
count++;
if(count == 5){
print(size, i, j, true);
}else{
print(size,i,j,false);
}
}
}
}
}
'알고리즘 - Baekjoon > Gold' 카테고리의 다른 글
[백준] 2668번 : 숫자고르기 Gold5(골드5) - JAVA[자바] (0) | 2023.12.12 |
---|---|
[백준] 1963번 : 소수 경로 Gold4(골드4) - JAVA[자바] (0) | 2023.11.28 |
[백준] 11729번 : 하노이 탑 이동 순서 Gold5(골드5) - JAVA[자바] (1) | 2023.11.26 |
[백준] 12851번 : 숨바꼭질2 Gold4(골드4) - JAVA[자바] (0) | 2023.11.25 |
[백준] 11054번 : 가장 긴 바이토닉 부분 수열 Gold4(골드4) - JAVA[자바] (0) | 2023.11.25 |