6일차 2024.10.26(별 안에 별 안에 별찍기)

칙촉·2024년 10월 27일

🎯시작 전 목표

  1. 별 안에 별 안에 별찍기

💻Today I learned

별 안에 별 안에 별찍기( •̀ ω •́ )✧

백준허브 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초가 걸리지 않았는데 실패라는 걸 보니 그냥 내가 마음에 안드나보다.

코드를 짜놓고 나서 보니 확실히 비효율적으로 보이긴 해서 내일은 코드를 개선해 실행 시간을 줄이고 다시 제출을 해 볼 생각이다.
덤으로 시간복잡도에 관한 공부도 필요해보이니 병행하면 좋겠다는 생각이 든다.
완벽한 코드는 아니지만 일단 풀었다는 데 의의를 두고 개선해가며 성장해나가면 해결될 문제다.

#마치며

문제를 많이 푸는 것도 좋지만, 한 문제를 다양한 측면으로 오랫동안 생각해보며 푸는 것도 사고의 폭을 넓히는 데 도움이 된다고 생각한다. 스스로 생각해 문제를 해결해나가며 성장하는 것이 무엇보다 중요하다고 생각한다. 인간은 도구를 쓰는 동물인데, 생각없이 살면 도구가 된다.

profile
강세민

0개의 댓글