티스토리 뷰

 

문제

 

재귀적인 패턴으로 별을 찍자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N x N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 간에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) x (N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.

 

 

출처 : https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

 

 

 

 

입, 출력

 

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3^k이며, 이때 1 ≤ k < 8이다.

 

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

N = 9 일 때

*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********

 

N = 27 일 때

***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

 

 

 

 

 

생각해야 할 것

 

  1. 영역들을 숫자 키패드라고 생각하자!
  2. 가운데 영역은 항상 뻥 뚫어라!

영역 나눠진거

 

 

 

 

 

 

 

풀이(잘못된 접근 - 오답)

 

  1. N을 입력하게 되면 N * 3 에서 N 개수만 있는 (0, 0) 영역이라고 생각했다.
    예를 들어) 입력 : 27 하면 String[81][81]에서 27개 영역으로 짜여져 있는 (0, 0) 영역의 부분으로 생각했다.
  2. (1, 1) 영역이 아니면 무조건 재귀 함수 호출을 하였다.
  3. N 값을 이용해서 무조건 가운데를 뚫었다.

결론적으론 N이 81, 243 이렇게 큰 수가 되었을 때 2, 3번 재귀 함수로 인해 들어가면 해당 영역이 상위의 상위 영역에 어떤 부분인지 알 수 없었다.

 

예를 들어, (0,0) 영역재귀함수 2번 실행되어 깊게 들어간 후 가운데 뚫는 것(2, 2) 영역에 재귀함수 2번 실행되어 깊게 들어간 후 가운데 뚫는 거랑 같은 것을 실행하고 있었기 때문에 문제가 있었다.

 

잘못된 풀이

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());

        String[][] stars = new String[N][N];
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                stars[i][j] = "*";
            }
        }

        reclusive(N, stars, 0 ,0 ,0 ,0);

        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                sb.append(stars[i][j]);
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }

    private static void reclusive(int N, String[][] stars, int r, int c, int upR, int upC) {
        if(N <= 1) return;
        int newN = N/3;

        if( !(r == 1 && c == 1) ){ // 다른 영역이면 재귀 함수 실행
            for(int row = 0; row < 3; row++){
                for(int col = 0; col < 3; col++){
                    reclusive(newN, stars, row, col, r, c);
                }
            }
        } else {
            // 가운데 영역은 어차피 상위로 올라가서 크게 뚫으니 그냥 return;
            return;
        }


        // 함수 실행하면 무조건 들어온 영역 뚫기
        for(int i = ((N*r) + newN) + 3*N *upR ; i <  ((N*r) + newN*2) + 3*N *upR; i++){
            for(int j = ((N*c) + newN) + 3*N *upC; j < ((N*c) + newN*2) + 3*N *upC; j++){
                stars[i][j] = " ";
            }
        }
    }
}

 

 

잘못된 풀이 출력

더보기
*********************************************************************************
* ** ** ** ** ** ** ** ** *******************************************************
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ****   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** *******************************************************
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** **********         ******************         *********
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ****   ***         ***   ******   ***         ***   ***
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** **********         ******************         *********
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** *******************************************************
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ****   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** *******************************************************
*********************************************************************************
***************************                           ***************************
***************************                           ***************************
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
***   ******   ******   ***                           ***   ******   ******   ***
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
***************************                           ***************************
***************************                           ***************************
*********         *********                           *********         *********
*********         *********                           *********         *********
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
***   ***         ***   ***                           ***   ***         ***   ***
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
*********         *********                           *********         *********
*********         *********                           *********         *********
***************************                           ***************************
***************************                           ***************************
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
***   ******   ******   ***                           ***   ******   ******   ***
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
***************************                           ***************************
***************************                           ***************************
*********************************************************************************
*********************************************************************************
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
*********************************************************************************
*********************************************************************************
*********         ******************         ******************         *********
*********         ******************         ******************         *********
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
*********         ******************         ******************         *********
*********         ******************         ******************         *********
*********************************************************************************
*********************************************************************************
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
*********************************************************************************
*********************************************************************************

 

 

 

 

 

풀이 (올바른 접근 - 정답)

 

  • 별을 비우는 부분 계산식 :
    r + newNc + newN은 주어진 크기 N의 가운데 작은 정사각형 영역의 시작 위치를 나타냅니다.
    r + 2 * newNc + 2 * newN은 작은 정사각형 영역의 끝 위치입니다.
  • 재귀 호출 부분 계산식
    r + row * newNc+ col * newN은 3x3 작은 정사각형 영역을 만들기 위해 각 작은 정사각형 영역의 시작위치를 계산합니다.
    row와 col은 각각 0부터 2까지의 인덱스로서 3x3 작은 정사각형 영역의 행과 열을 나타냅니다. newN은 현재 크기의 1/3을 나타냅니다.
    따라서 r + row * newNc + col * newN은 각 작은 정사각형 영역의 시작 위치를 나타냅니다
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());
        StringBuilder sb = new StringBuilder();
        String[][] stars = new String[N][N];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                stars[i][j] = "*";
            }
        }

        recursive(N, stars, 0, 0);
        
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(stars[i][j]);
            }
            sb.append("\n");
        }
        System.out.println(sb.toString());
    }

    private static void recursive(int N, String[][] stars, int r, int c) {
        if (N == 1) return; // 기저 조건

        int newN = N / 3;

        for (int i = r + newN; i < r + 2 * newN; i++) {
            for (int j = c + newN; j < c + 2 * newN; j++) {
                stars[i][j] = " ";
            }
        }

        // 9개의 분할 영역에 대해 재귀 호출
        for (int row = 0; row < 3; row++) {
            for (int col = 0; col < 3; col++) {
                recursive(newN, stars, r + row * newN, c + col * newN);
            }
        }
    }
}

 

 

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함