백준 2448번 별찍기 JAVA

2 minute read

문제 접근 방법

최소 입력값에서 시작해서 규칙 찾기

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

문제에서 입력값으로 주어지는 N은 삼각형의 높이를 의미한다. 고로 N == for문 반복 개수

입력이 12 일 경우 예제 출력
           *           
          * *          
         *****         
        *     *        
       * *   * *       
      ***** *****      
     *           *     
    * *         * *    
   *****       *****   
  *     *     *     *  
 * *   * *   * *   * * 
***** ***** ***** *****

예제 출력를 보면 최소 단위 삼각형이 보인다.

최소 단위 삼각형 <- N = 3일때
  *  
 * * 
*****

이제 N 값을 늘려가며 생각해보기

N = 6
     *     
    * *    
   *****   
  *     *  
 * *   * * 
***** *****

N=3일때의 삼각형이 우측과 위에 하나씩 더 생김, 자세히 보니 우측은 한칸 띄고 생김

N = 12
           *           
          * *          
         *****         
        *     *        
       * *   * *       
      ***** *****      
     *           *     
    * *         * *    
   *****       *****   
  *     *     *     *  
 * *   * *   * *   * * 
***** ***** ***** *****

N=6일때의 삼각형이 우측과 위에 하나씩 더 생김, 이제 어떻게 풀어야 할지 감이 조금 옴

N = 6 
  *    // N=3일때, i[0] = " * "
 * *    
*****  
  *     *   //N=3일때의 그림을 2개 복사,  i[3] = i[0]+" "+i[0]
 * *   * * 
***** *****

이런식으로 이전 단계 다음 배열 인덱스에 이전 단계의 그림을 2개 복사

N = 6 
     *    // N=3일때, 좌, 우 공백 3칸 추가 
    * *    
   *****  
  *     *   //N=3일때의 그림을 2개 복사
 * *   * * 
***** *****

그리고 이전 단계의 그림에 좌, 우 공백 추가, 공백 개수는 이전 단계의 배열 길이 만큼

결론 : 이전 단계의 그림을 2개 복사하되 각 그림은 한칸의 공백을 갖음, 그리고 이전 단계의 그림에 복사하기 전 배열 길이만큼 좌, 우 공백 추가

//결과 코드
public class P2448 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        final int N = sc.nextInt();

        List<String> p = new ArrayList<>(N);
        //N이 3일때 세팅
        p.add("  *  ");
        p.add(" * * ");
        p.add("*****");

        //N => 3*2^k, 3, 6, 12, 24, 48, ... 이니깐 k가 1번째, 2번째 를 나타냄
        for(int k=1; 3 * (int)Math.pow(2, k) <= N; k++) { //6입력부터 루프 실행
            setStar(p);
        }

        //출력
        for(String s : p){
            System.out.println(s);
        }
    }

    private static void setStar(List<String> p){
        StringBuilder s = new StringBuilder();
        StringBuilder s2 = new StringBuilder();

        int pSize = p.size();

        for(int i=0; pSize>i; i++){
            s.delete(0,s.length());

            //전 단계의 그림을 아래 하나, 옆 하나 이렇게 총 2개 복사
            s.append(p.get(i)); //전 단계의 그림
            s.append(" ");      //공백
            s.append(p.get(i)); //전 단계의 그림

            p.add(s.toString());

            //전 단계 그림의 왼쪽, 오른쪽에 공백 추가
            s2.delete(0,s.length());
            for(int j=0; pSize>j; j++){
                s2.append(" ");
            }

            p.set(i, s2.toString() + p.get(i) + s2.toString());
        }
    }
}

풀이 후 다른분들 코드 보니깐 정말 다양하게 풀었더군요.. ㅎㅎ; 제 풀이가 심플하게 풀린거 같아서 공유합니다.

Updated: