반응형
문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1
24
예제 출력 1
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static BufferedReader bf;
private static StringTokenizer st;
private static int N;
private static char [][] map;
public static void main(String[] args) throws NumberFormatException, IOException {
bf=new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(bf.readLine());
map=new char[N][5*(N/3)+(N/3-1)];
for(int r=0;r<N;r++) {
for(int c=0;c<5*(N/3)+(N/3-1);c++) {
map[r][c]=' ';
}
}
divide(0, N-1, N);
StringBuilder sb=new StringBuilder();
for(char []r:map) {
for(char c:r) sb.append(c);
sb.append("\n");
}
System.out.println(sb);
}
public static void divide(int x, int y, int height) {
if(height==3) {
map[x][y]='*';
map[x+1][y-1]=map[x+1][y+1]='*';
for(int i=0;i<5;i++) {
map[x+2][y-2+i]='*';
}
return;
}
divide(x, y, height/2);
divide(x+height/2, y-height/2, height/2);
divide(x+height/2, y+height/2, height/2);
}
}
*
* *
*****
위 모양을 기준으로 분할하여 문제를 해결하였습니다. 분할 정복 시에 시작점은 위 모양의 위쪽 꼭짓점을 기준으로 하였습니다.
반응형
'코딩테스트 > 분할 정복(Divide and Conquer)' 카테고리의 다른 글
[Java] 백준 2263번 : 트리의 순회 (0) | 2022.05.02 |
---|---|
[Java] 백준 17829번 : 222-풀링 (0) | 2022.03.03 |
[Java] 백준 2447번 : 별 찍기 - 10 (0) | 2022.03.03 |
[Java] 백준 1074번 : Z (0) | 2022.02.15 |
[Python] 백준 2447번 : 별 찍기 (0) | 2022.01.18 |