본문 바로가기
PS/BOJ

백준 10997 자바 - 별 찍기 - 22 (BOJ 10997 JAVA)

by Nahwasa 2021. 12. 25.

문제 : boj10997

 

 

1.

  일단 규칙부터 유추해보자. 대강 n이 주어질 때 우측상단부터 시작해서 n-0.5 바퀴 돌리는 별찍기라 볼 수 있다. 예를들어 3이라면 2.5바퀴를 돌린 형태이다.

 

2.

  좀 더 구체적으로 짤 수 있는 로직을 생각해 보자면, 1일 때는 그냥 예외로써 '*' 하나만 출력해주면 되겠고, n이 2 이상이라면 row의 개수는 3+4*n, column의 개수는 1+4*n 이 된다. 그리고 우측 상단부터 시작해서 좌,하,우,상의 방향을 순서대로 돌리면서 갈 수 있는 곳까지 별을 찍으면 된다. 갈 수 있는 조건은 배열의 끝 혹은 가려는 방향으로 2칸 앞이 이미 별인 경우 해당 위치까지만 찍을 수 있다.

 

  즉 row와 column 개수에 대한 점화식만 잘 세우고, 그 이후로는 단순 구현으로 풀 수 있는 문제이다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    private static final int[] DR = {0,  1, 0, -1};
    private static final int[] DC = {-1, 0, 1,  0};

    private int[][] makeStarArr(int n) {
        int[][] arr = new int[3+4*(n-1)][1+4*(n-1)];
        int r = 0;
        int c = arr[0].length-1;
        arr[r][c] = 1;

        while (true) {
            for (int i = 0; i < 4; i++) {
                int cnt = 0;
                while (true) {
                    if (r+DR[i]<0 || r+DR[i]>=arr.length || c+DC[i]<0 || c+DC[i]>=arr[0].length) break;
                    if (r+2*DR[i]>=0 && r+2*DR[i] < arr.length && c+2*DC[i]>=0 && c+2*DC[i] < arr[0].length && arr[r+2*DR[i]][c+2*DC[i]] == 1) break;
                    r += DR[i];
                    c += DC[i];
                    cnt++;
                    arr[r][c] = 1;
                }
                if (cnt == 0)
                    return arr;
            }
        }
    }

    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        if (n == 1) {
            System.out.println("*");
            return;
        }

        int[][] arr = makeStarArr(n);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            if (i == 1) {
                sb.append('*').append('\n');
                continue;
            }
            for (int j = 0; j < arr[0].length; j++) {
                sb.append(arr[i][j] == 1 ? '*':' ');
            }
            sb.append('\n');
        }

        System.out.print(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글