상세 컨텐츠

본문 제목

10994. 별 찍기 - 19

Algorithm

by aeongiii 2024. 11. 14. 16:26

본문


1. 문제 분석
    1) 예제를 보면, N개의 사각형을 겹쳐 그리고 있다.
    2) 가장 큰 사각형의 가로와 세로는 각각 4N-3이다.
    3) 가장 마지막에는 정가운데에 *을 하나 찍고 마무리한다.

2. 제약 조건
   1 <= N <= 100

3. 의사결정
    1) N을 입력받는다.
    2) 가로와 세로가 각각 4N-3인 2차원 배열을 만든다.
    3) N부터 1까지 점점 작아지는 재귀함수를 호출한다.
    4) N > 1일때까지 함수를 호출하면서 점점 작은 사각형을 그린다. (4개의 변을 그린다)
    5) N = 1에 도달하면 정가운데에 *을 찍는다.
    6) 완성된 2차원 배열을 출력한다.

4. 문제 해결
    1) 코드 흐름을 만드는 과정에서 N과 4N-3을 혼용해서 사용했다. 혼용 방지를 위해 4N-3을 size로 선언하여 사용했다.
    2) *과 ' '를 모두 찍는 방식은 번거로워서, 처음에 빈칸으로 초기화한 뒤에 필요한 부분만 *을 찍는 방식으로 수정했다.
    3) 점점 작은 사각형을 그리기 위해서 row와 col의 시작 위치를 -2하여 재귀함수를 호출했는데, 알고보니 +2 했어야 작아지는거였다..
    4) 사각형 아래 변을 그리는 코드 : matrix[size-1][col + i]이 아니라, matrix[row+size-1][col + i]로 주어야 한다. 오른쪽 변도 마찬가지!
 

 

+ 너무 까다로웠다.. 

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine()); // N 받기
        int size = 4 * N - 3;

        char[][] matrix = new char[size][size]; // 2차원 배열 생성

        // 2차원 배열을 ' '으로 초기화
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                matrix[i][j] = ' ';
            }
        }

        // 재귀함수 첫번째 호출
        square(matrix, 0, 0, size);

        // 완성된 배열을 한 줄씩 출력
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(matrix[i][j]);
            }
            System.out.println();
        }
    }

    // 재귀함수
    public static void square(char[][] matrix, int row, int col, int size) {

        // size=1인 경우, 정가운데 별 찍고 탈출
        if (size == 1) {
            matrix[row][col] = '*';
            return;
        }

        // size>1인 경우, 사각형 그리기
        for (int i = 0; i < size; i++) {
            matrix[row][col+i] = '*'; // 사각형 윗쪽 변 그리기
            matrix[row+size-1][col+i] = '*'; // 사각형 아래쪽 변 그리기
        }
        for (int i = 0; i < size; i++) {
            matrix[row+i][col] = '*'; // 사각형 왼쪽 변 그리기
            matrix[row+i][col+size-1] = '*'; // 사각형 오른쪽 변 그리기

        }

        // 재귀 함수 호출 (시작 위치를 변경하여 점점 작은 사각형으로 그린다)
        square(matrix, row+2, col+2, size-4);
    }

}
메모리 시간
35924 KB 876 ms

'Algorithm' 카테고리의 다른 글

17478. 재귀함수가 뭔가요?  (1) 2024.11.14
9184. 신나는 함수 실행  (1) 2024.11.14
25501. 재귀의 귀재  (0) 2024.11.14
24416. 알고리즘 수업 - 피보나치 수 1  (0) 2024.11.14
11975. 뜨거운 붕어빵  (1) 2024.11.14

관련글 더보기