코딩테스트/BOJ

[BOJ] 2448 별 찍기 11 - JAVA

5월._. 2023. 7. 16.
728x90

1. 문제

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.


2. 풀이

Main

1.  [N][N*2]칸 boolean 배열을 만든다.(static 변수임)

2.  별 찍는 메서드를 부른다.

3.  만약 board[i][j] 가 true면 별, false면 공백을 sb에 더한다.

4.  출력한다.

static boolean[][] board;
public static void main(String[] args) throws IOException {
   int N = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
   board = new boolean[N][N*2];

   star(0,0,N);

   StringBuilder sb = new StringBuilder();
   for(int i=0;i<N;i++){
      for(int j=0;j<2*N;j++){
         if(board[i][j]) sb.append('*');
         else sb.append(' ');
      }
      sb.append('\n');
   }

   System.out.print(sb);
}

 

별 찍기

분할정복 방식이라고 생각하면 된다. size가 3일때를 base로 둔다.

i, j는 별을 찍어야 하는 보드의 시작지점이다.

세로로 이등분해서 윗쪽 가운데에 하나, 아랫쪽 양 옆으로 하나씩 재귀호출하면 된다.

이때 오른쪽 아래 삼각형은 i+resize, j+size가 시작지점인 것을 명심해야 한다!

private static void star(int i, int j, int size){
   if(size==3){
      board[i][j+2] = board[i+1][j+1] = board[i+1][j+3] = true;
      for(int k=0;k<5;k++) board[i+2][j+k] = true;
      return;
   }

   int resize = size/2;
   star(i,j+resize,resize);
   star(i+resize,j,resize);
   star(i+resize,j+size,resize);
}

 

전체 코드

import java.io.*;

public class BOJ_2448_별찍기11 {
   static boolean[][] board;
   public static void main(String[] args) throws IOException {
      int N = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
      board = new boolean[N][N*2];

      star(0,0,N);

      StringBuilder sb = new StringBuilder();
      for(int i=0;i<N;i++){
         for(int j=0;j<2*N;j++){
            if(board[i][j]) sb.append('*');
            else sb.append(' ');
         }
         sb.append('\n');
      }

      System.out.print(sb);
   }
   private static void star(int i, int j, int size){
      if(size==3){
         board[i][j+2] = board[i+1][j+1] = board[i+1][j+3] = true;
         for(int k=0;k<5;k++) board[i+2][j+k] = true;
         return;
      }

      int resize = size/2;
      star(i,j+resize,resize);
      star(i+resize,j,resize);
      star(i+resize,j+size,resize);
   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1504 특정한 최단 경로 - JAVA  (0) 2023.07.18
[BOJ] 13172 Σ - JAVA  (0) 2023.07.17
[BOJ] 15501 부당한 퍼즐 - JAVA  (0) 2023.07.15
[BOJ] 1238 파티 - JAVA  (0) 2023.07.14
[BOJ] 1918 후위 표기식 - JAVA  (0) 2023.07.13

댓글