코딩테스트/분할 정복(Divide and Conquer)

[Java] 백준 2448번 : 별 찍기 - 11

sujin7837 2022. 3. 3. 20:02
반응형

문제

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

입력

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

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

24

예제 출력 1

                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****                   
                 *           *                  
                * *         * *                 
               *****       *****                
              *     *     *     *               
             * *   * *   * *   * *              
            ***** ***** ***** *****             
           *                       *            
          * *                     * *           
         *****                   *****          
        *     *                 *     *         
       * *   * *               * *   * *        
      ***** *****             ***** *****       
     *           *           *           *      
    * *         * *         * *         * *     
   *****       *****       *****       *****    
  *     *     *     *     *     *     *     *   
 * *   * *   * *   * *   * *   * *   * *   * *  
***** ***** ***** ***** ***** ***** ***** *****

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	private static BufferedReader bf;
	private static StringTokenizer st;
	
	private static int N;
	private static char [][] map;
	
	public static void main(String[] args) throws NumberFormatException, IOException {

		bf=new BufferedReader(new InputStreamReader(System.in));
		N=Integer.parseInt(bf.readLine());
		map=new char[N][5*(N/3)+(N/3-1)];
		
		for(int r=0;r<N;r++) {
			for(int c=0;c<5*(N/3)+(N/3-1);c++) {
				map[r][c]=' ';
			}
		}
		divide(0, N-1, N);
		StringBuilder sb=new StringBuilder();
		for(char []r:map) {
			for(char c:r) sb.append(c);
			sb.append("\n");
		}
		System.out.println(sb);
	}

	public static void divide(int x, int y, int height) {
		if(height==3) {
			map[x][y]='*';
			map[x+1][y-1]=map[x+1][y+1]='*';
			for(int i=0;i<5;i++) {
				map[x+2][y-2+i]='*';
			}
			return;
		}
		divide(x, y, height/2);
		divide(x+height/2, y-height/2, height/2);
		divide(x+height/2, y+height/2, height/2);
	}
}

  *

 * *

*****

 

위 모양을 기준으로 분할하여 문제를 해결하였습니다. 분할 정복 시에 시작점은 위 모양의 위쪽 꼭짓점을 기준으로 하였습니다.

반응형