본문 바로가기
알고리즘 풀이/백준

[BOJ] 2448. 별 찍기 - 11 - JAVA

by 2245 2022. 12. 16.

🔗 문제

https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

 

🧩 풀이 및 코드

문제 유형 : 재귀

 

재귀 연습 많이 해야 겠다...

 

  • k = 0 ( 즉, N = 3) 일 떄는 기본 블록
  *  
 * *
*****
  • 규칙을 찾으면 크게 2줄로 구분된다.
  • 첫 번째 줄은 중앙에 한 개의 블록, 두 번째 줄은 빈칸을 사이에 둔 두 개의 블록
     *        
    * *        
   *****     
  *     *    
 * *   * *  
***** *****

 

  • 두 번째 줄은 블록을 한 개 삽입하고, 빈칸 삽입하고, 블록 한 개 삽입
  • 첫 번쨰 줄은 블록을 중앙에 놓기 위해 블록 앞과 뒤에 빈칸을 삽입 (빈칸의 수 = N/2개)
  • 현재 만들어진 전체 그림이 다음 재귀에서 한 개의 부분 불록이 된다.

 

전체 코드

import java.io.*;
import java.util.*;

public class Main_bj_2448_별찍기11 {
	static int N;
	
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		N = Integer.parseInt(sc.next());
		StringBuilder[] sb = new StringBuilder[N];
		for(int i=0; i<N; i++)
			sb[i] = new StringBuilder();
		sb[0].append("  *  ");
		sb[1].append(" * * ");
		sb[2].append("*****");
		
		if(N>3) sb = star(1, sb);
		
		for(int i=0; i<N; i++)
			System.out.println(sb[i]);
		sc.close();
	}
	
	static StringBuilder[] star(int k, StringBuilder[] sb) {
		int n = (int) (3 * Math.pow(2, k));
		if(n<=N) {
			int idx = 0;
			for(int i=n/2; i<n; i++) {
				sb[i].append(sb[idx]).append(" ").append(sb[idx++]);
			}
			
			StringBuilder sbb = new StringBuilder();
			for(int i=0; i<n/2; i++)
				sbb.append(" ");
			
			for(int i=0; i<n/2; i++) {
				sb[i].insert(0, sbb);
				sb[i].append(sbb);
			}
			
			return star(k+1, sb);
		}
		
		return sb;
	}
}

'알고리즘 풀이 > 백준' 카테고리의 다른 글

[BOJ] 3036. 링 - JAVA  (1) 2023.01.20
[BOJ] 1004. 어린왕자 - JAVA  (1) 2023.01.19
[BOJ] 1976. 여행 가자 - JAVA  (0) 2022.12.15
[BOJ] 1241. 머리 톡톡 - JAVA  (0) 2022.12.15
[BOJ] 13460. 구슬탈출2 - JAVA  (0) 2022.12.14