반응형
-내 생각
솔직히 문제에 대한 이해는 어느정도 쉽다고 생각한다. 프렉탈 형태의 별들을 나눠서 생각해보면 규칙은 금방 찾을 수 있을 것이다. 그러나 재귀적으로 이를 구현하는데 있어서 너무 어려워 다른 분들의 코드를 많이 참고했으며, 완전히 이해되지 않았기 때문에 지속적으로 해설해봐야 할 것 같다고 생각한다.
-해법
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]);
}
}
}
알고리즘 너무 어려워... 설명하기도 힘들다 ㅠ ㅠ 혹시라도 이 글을 보시는 분들 께서는 재귀호출 부분의 변수들을 하나 씩 디버깅해보면서 확인하시면 이해는 되실겁니다...
반응형