Algorithm/백준

별 찍기 - 11 Java

whyWhale 2020. 12. 12.

www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

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

www.acmicpc.net

규칙을 찾기 위해 그림으로 설명하겠다.

분할하여 쪼개어 질 수 없을 때까지 계속 분할을 한다. 

함수의 인자는 가장 꼭대기에 있는 *의 위치를 보내주는 것이다. 그 별의 x,y좌표를 보내준다.

bufferdWriter를 쓴 이유는 시간초과로 인하여 사용하였다.

package Al_Study.set0_APPENDIX_별찍기;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Star_11 {
    //높이 n  가로의 길이 2n-1
    static char arr[][];
    public static void main(String[] args) throws IOException {
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        arr=new char[n+1][2*n];

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < 2*n; j++) {
                arr[i][j] = ' ';
            }
        }
        star_11(0, n - 1, n);

        //출력.
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < 2*n - 1; j++) {
                bw.write(arr[i][j]+"");
            }
            bw.newLine();
        }
        bw.flush();
        bw.close();
        sc.close();
    }
    static void star_11(int x, int y, int n) {
        if(n == 3) {
            // 더 이상 분할 할 수 없으므로 별을 그린다.
            arr[x][y] = '*';//                '*'
            arr[x + 1][y - 1] = '*';//      *
            arr[x + 1][y + 1] = '*'; //           *
            for(int j = y - 2; j <= y + 2; j++) {  // 밑변의 별
                arr[x + 2][j] = '*';
            }
            return;
        }

        star_11(x, y, n / 2); // 위 삼각형
        star_11(x + n / 2, y - n / 2, n/2); // 아래 왼쪽 삼각형
        star_11(x + n / 2, y + n / 2, n/2); // 아래 오른쪽 삼각형
    }
}

'Algorithm > 백준' 카테고리의 다른 글

영우는 사기꾼?  (0) 2022.11.15
BOJ1931_회의실 배정  (0) 2021.10.24
PS 관련 유입 경로  (0) 2021.03.27
백준__2229번 : 조 짜기 (골드 5)  (0) 2021.01.05
별 찍기-19 Java  (0) 2020.12.12

댓글