✔ 별 안에 별 안에 별찍기( •̀ ω •́ )✧
백준허브 30678번 문제인 별 안에 별 안에 별찍기 문제가 사고 능력 향상에 도움이 된다는 말을 듣고 한 번 풀어보았다.
문제의 내용은 다음과 같다.
프랙탈 구조는 지닌 별모양을 출력하는 문제로 재귀함수를 통해 구현할 수 있을 것으로 보인다.
입력은 0<=N<=5로 한정되어 있다.
다음은 내가 작성한 코드이다.import java.util.Scanner; public class CountingStar{ int n = new Scanner(System.in).nextInt(); int size = Power5(n); boolean[][] bluePrint= {{false,false,true,false,false} ,{false,false,true,false,false} ,{true,true,true,true,true} ,{false,true,true,true,false} ,{false,true,false,true,false}}; boolean[][] star = new boolean[size][size]; public void Start()//Start함수는 Main클래스 내에서 호출돼있다. { DrawStar(0, 0, 0,0,0); PrintStar(star); } //level은 재귀횟수, row, col은 bluePrint와 대응되는 좌표, x, y는 배열의 실제 좌표를 기준으로 한 현 재귀함수의 위치이다. private void DrawStar(int level, int row, int col, int x, int y) { if(level <n) { if(bluePrint[row][col]) { DrawStar((level+1), 0, 0,x+row*(Power5(n-1-level)),y+col*(Power5(n-1-level))); } if(col<4) DrawStar(level, row, (col+1),x,y); else if(row<4) DrawStar(level,(row+1),0,x,y); } else { if(bluePrint[row][col]) star[x][y] = true; if(col<4) DrawStar(level, row, (col+1),x,y); else if(row<4) DrawStar(level,(row+1),0,x,y); } } private void PrintStar( boolean[][] n) { for (boolean[] i : n) { for (boolean j : i) { System.out.printf("%c", j ? '*' : ' '); } System.out.println(); } } private int Power5(int n) { short a = 1; for (int i = 0; i < n; i++) { a *= 5; } return a; } }설명은 쓰다가 귀찮아서 안썼다.
실행해보면 실제로 정답과 같은 출력을 하지만, 안타깝게도 백준허브에선 시간초과로 실패 처리 되었다.
시간제한은 출력시간 제외 1초였는데, 분명 PC에서는 출력 시작까지 1초가 걸리지 않았는데 실패라는 걸 보니 그냥 내가 마음에 안드나보다.코드를 짜놓고 나서 보니 확실히 비효율적으로 보이긴 해서 내일은 코드를 개선해 실행 시간을 줄이고 다시 제출을 해 볼 생각이다.
덤으로 시간복잡도에 관한 공부도 필요해보이니 병행하면 좋겠다는 생각이 든다.
완벽한 코드는 아니지만 일단 풀었다는 데 의의를 두고 개선해가며 성장해나가면 해결될 문제다.
문제를 많이 푸는 것도 좋지만, 한 문제를 다양한 측면으로 오랫동안 생각해보며 푸는 것도 사고의 폭을 넓히는 데 도움이 된다고 생각한다. 스스로 생각해 문제를 해결해나가며 성장하는 것이 무엇보다 중요하다고 생각한다. 인간은 도구를 쓰는 동물인데, 생각없이 살면 도구가 된다.