별 찍기 - 11

이상민·2024년 1월 23일
0

알고리즘

목록 보기
127/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;


public class Star {

	static char[][] map;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		map = new char[N][2*N-1];
		for (int i = 0; i < N; i++) {
			Arrays.fill(map[i], ' ');
		}
		
		Star(0,N-1,N);
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < 2*N-1; j++) {
				sb.append(map[i][j]);
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
	public static void Star(int row,int col,int size) {
		if(size==3) {
			map[row][col] = '*';
			map[row+1][col-1] = map[row+1][col+1]='*';
			map[row+2][col-2] = map[row+2][col-1] = map[row+2][col]=map[row+2][col+1]=map[row+2][col+2]='*';
			
		}
		else {
			Star(row,col,size/2);
			Star(row+size/2,col-size/2,size/2);
			Star(row+size/2,col+size/2,size/2);
		}
	}
}

풀이 방법


이러한 삼각형은 기본형인 아래 삼각형이 여러개 모여 만들어졌다.

또한 각 꼭지점을 기준으로 3영역으로 분할하면 같은 삼각형이 되는데
이를 계속 나누다 보면 기본형 삼각형이 될때까지 나눌 수 있다.
즉, 분할정복 방식으로 풀 수 있다.

  1. 각 삼각형의 가장 위쪽 별을 기준으로 3영역 분할정복을 수행한다.
  2. SIZE가 3이 될때, 배열에 별을 찍어넣는다.

📢주의 char형 배열에 모두 공백으로 초기화 시켜줘야 한다.
아니면 null값이기 때문에 출력은 똑같이 나오지만 내부적으로 다르기 때문.

후기

print문을 배열에 찍는것이 유리하다는 것을 알았다.
분할정복 방법으로 푸는것에 익숙해져야겠다.

profile
개린이

0개의 댓글