[백준,BOJ 2447] 별 찍기-10(JAVA 구현)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 2447] 별 찍기-10(JAVA 구현)

반응형

 

-내 생각

  솔직히 문제에 대한 이해는 어느정도 쉽다고 생각한다. 프렉탈 형태의 별들을 나눠서 생각해보면 규칙은 금방 찾을 수 있을 것이다. 그러나 재귀적으로 이를 구현하는데 있어서 너무 어려워 다른 분들의 코드를 많이 참고했으며, 완전히 이해되지 않았기 때문에 지속적으로 해설해봐야 할 것 같다고 생각한다.

 

-해법

  n으로 입력받은 3의 제곱을 이용하여 각 점에 맞게 위치를 움직이는게 중요한 것 같다. 예를들어 n이 3일 경우 별의 시작은 (0,0)부터이며, n이 9일 경우 시작은(0,0) , (0,3) , (0,6)  , (3,0) , (3,3) , (3,6) , (6,0) , (6,3) , (6,6) 부터이다. 이와 같은 특징으로 3x3의 크기로 반복해서 출력한다고 생각하면 되는데 재귀 호출시마다 시작점으로 옮겨서 3x3만큼 찍어야 하기 때문에 개인적으로는 굉장히 복잡하다고 생각했다. 

 

import java.util.*;

public class Main {
	
	static char arr[][]; //n크기만큼 2차원 배열을 생성한다.
	public static void star(int a,int b,int n) { // 재귀호출을 반복 할 메소드이다.
		int div = 0;
		if(n==1) { // 재귀 호출이 끝나는 부분
			arr[a][b] = '*';
			return;
		}
		
		 div= n/3; // 입력받은 n 값을 계속 3씩 나눠준다.
		
		for(int i=0;i<3;i++) { //3x3크기의 별을 만든다.
			for(int j=0;j<3;j++) {
				if(i==1 && j ==1) continue;
				star(a+(div*i),b+(div*j),div); //시작점을 옮겨준다. 27의 경우 (0,0) (0,9) 식으로 옮겨간다.
			}
		}
	        
	}
		

	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n= sc.nextInt();
		
		arr = new char[n][n];
		
		for(int i=0;i<arr.length;i++) {
			Arrays.fill(arr[i],' ');
		}
		
		 		
		
		
		
		star(0,0,n);
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
		
		
	}
	
}

  알고리즘 너무 어려워... 설명하기도 힘들다 ㅠ ㅠ 혹시라도 이 글을 보시는 분들 께서는 재귀호출 부분의 변수들을 하나 씩 디버깅해보면서 확인하시면 이해는 되실겁니다... 

반응형