입력
첫째 줄에 N이 주어진다. N은 항상 $3×2^k$ 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1
24
예제 출력 1
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
풀이
Recursion으로 보인다. 바텀-업의 관점에서 쪼개본다면,
*
* *
*****
이러한 모양이 반복된다는 점을 알 수 있다. 따라서, atomic한 별이 위의 모양이고, 이를 level 0이라고 한다.
위 입력 24에서 level 3의 그림이 그려졌고 여기서 3은 $3×2^3=24$에서 지수 3이다.
2차원의 문자배열을 만들어 공백으로 채운 다음에, 별을 추가해주는식으로 구현한다.
x, y값을 넣어주고, level이 0이라면 채우는 식이다.
import java.io.*;
class _2448{
public static char[][] arr;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = (int)(Math.log(Integer.parseInt(br.readLine()) / 3) / Math.log(2));
arr = new char[(int)Math.pow(2, N)*3][(int)Math.pow(2, N)*6];
for(int i = 0; i < arr.length; i++)
for(int j = 0 ; j < arr[0].length; j++)
arr[i][j] = ' ';
star(0, arr.length-1, N);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr[0].length; j++)
sb.append(arr[i][j]);
sb.append("\n");
}
System.out.println(sb);
}
static void star(int x, int y, int N){
if (N == 0){
for(int i = 0; i < 3; i++){
for(int j = i; j < 5; j += i+1){
arr[y-i][x+j] = '*';
}
}
return;
}
star(x, y, N-1);
star(x + (int)Math.pow(2, N)*3, y, N-1);
star(x + (int)Math.pow(2, N-1)*3, y - (int)Math.pow(2, N-1)*3, N-1);
}
}
'Algorithm > Problems' 카테고리의 다른 글
[JAVA]합분해(Baekjoon) (0) | 2023.03.24 |
---|---|
[JAVA]평범한 배낭(Baekjoon) (0) | 2023.03.21 |
[JAVA]특별상이라도 받고 싶어(Baekjoon) (0) | 2023.02.28 |
[JAVA]두 수의 합(Baekjoon) (0) | 2023.02.24 |
[JAVA]색종이(Baekjoon) (0) | 2023.02.24 |