본문 바로가기
아기 개발자/백준 문제풀이

[BOJ_JAVA] 백준 2447번 : 별찍기 @달깅

by 달깅 2019. 11. 2.

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

 

진짜 뭔소리지?? 그니까 일단 패턴 파악하는 거 부터가 나한텐 너무 버거웠다..ㅜㅜㅜ

 

이게 대체 무슨 규칙이냐구.. 알기는 하겠지만 이걸 어떻게 재귀로 부르란 건지 너무 답답해서 이 문제를 풀다가 백준 풀이를 한 동안 그만뒀었다..^^

베이스 케이스를 n=3일때로 해서 그 모양 그대로 찍으면 될 거 같은데 그걸 못하겠어서 계속 막힘..

 

어레이 카피 기능을 알게 됐고 또 다차원 배열에서 어레이 카피를 어떻게 하는지도 알아냄! 얕은 차원, 깊은 차원의 어레이 카피는 다르다..!!

이거를 활용해서 인풋 넘버가 들어왔을 때 그거를 3으로 각각 나눈 그 부분을 전체적으로 가운데 부분을 빼고 어레이 카피를 해주기로 했다.

 

 

 

처음에 작성을 했는데 베이스 케이스가 공백으로 나왔다..

 

생각해보니까 보드 첫번 째 칸은 복사를 안해줘서 그런거였다. ㅎㅎ 그래서 그것도 복사해줘서 코드를 고쳤는데 

시간초과가 떴다..!ㅎㅎㅎㅎㅎㅎㅎㅎㅎ 산넘어 산이구나

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int input=sc.nextInt();
        char[][] board=new char[input][input];

        board=makeBoard(board, input);
        
        for (int i=0; i<board.length; i++) {
            for (int j=0; j<board[0].length; j++) {
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
        

    }

    public static char[][] makeBoard(char[][] board, int input) {
        if (input==3) {
            for (int i=0; i<3; i++) {
                board[0][i]='*';
                board[1][i]='*';
                board[2][i]='*';
            }
            board[1][1]=' ';
            return board;
        } else {

            int k=input/3;
        
            char[][] b1=new char[k][k];


            deepCopy(board, b1, 0, 0, 0, k);
            b1=makeBoard(b1, k);
            deepCopy(b1, board, 0, 0, 0, k);
            deepCopy(b1, board, 0, k, 0, k);
            deepCopy(b1, board, 0, 2*k, 0, k);

            deepCopy(b1, board, 0, 0, k, k);
            deepCopy(b1, board, 0, 2*k, k, k);

            deepCopy(b1, board, 0, 0, 2*k, k);
            deepCopy(b1, board, 0, k, 2*k, k);
            deepCopy(b1, board, 0, 2*k, 2*k, k);
        }

        return board;

    }

    public static char[][] deepCopy(char[][] ori, char[][] target, int start1, int start2, int verStart, int length) {

        for (int i=0; i<length; i++){
            System.arraycopy(ori[i], start1, target[verStart+i], start2, length);
        }
        return target;
    }

}

답은 맞는데 시간초과래....ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

어떻게 해야할지 모르겠다 흑

 

그 가운데만 뻥 뚫려있다는 거는, 다시 생각해보면 그냥 3으로 나눴을 때 나머지가 1인 경우만 (x, y축 양 쪽 다) 비어있다는 거니까 그럼 새로 짜보자..!!

 

그래서.. 결국 구글링 해서 참고도 좀 하고 해서

import java.util.*;
public class Main {
    static char[][] board;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int input=sc.nextInt();
        board=new char[input][input];
        

        for (int i=0; i<input; i++) {
            Arrays.fill(board[i], ' ');
        }

        makeBoard( 0, 0, input);
        
        for (int i = 0; i < input; i++) {
            System.out.println(board[i]);
        }

    }

    public static void makeBoard(int x, int y, int n) {
        if (n==1) {
            board[x][y]='*';
            return;
        } 
        int k=n/3;
        for (int i=0; i<3; i++) {
            for (int j=0; j<3; j++) {
                if (i==1 && j==1) {
                    continue;
                }
                makeBoard( x+k*i, y+k*j, k);
            }
        }
    }


}

완성했다ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

우리 동아리 선배들이 모르는 코드를 보고 왜인지 이해하는 것도 중요하다고 했다.

이 문제는 꼭 기억해 두고 내가 모르는 거였으니까 이렇게 간단하게 짤 수 있다는 것도 항상 기억하고

또 또 뭐냐.. 패턴 파악을 어떻게 하는건지도 꼭 기억해두자!!!!

문제는 별표 표시 해두었다

댓글