진짜 뭔소리지?? 그니까 일단 패턴 파악하는 거 부터가 나한텐 너무 버거웠다..ㅜㅜㅜ
이게 대체 무슨 규칙이냐구.. 알기는 하겠지만 이걸 어떻게 재귀로 부르란 건지 너무 답답해서 이 문제를 풀다가 백준 풀이를 한 동안 그만뒀었다..^^
베이스 케이스를 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);
}
}
}
}
완성했다ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
우리 동아리 선배들이 모르는 코드를 보고 왜인지 이해하는 것도 중요하다고 했다.
이 문제는 꼭 기억해 두고 내가 모르는 거였으니까 이렇게 간단하게 짤 수 있다는 것도 항상 기억하고
또 또 뭐냐.. 패턴 파악을 어떻게 하는건지도 꼭 기억해두자!!!!
문제는 별표 표시 해두었다
'아기 개발자 > 백준 문제풀이' 카테고리의 다른 글
[BOJ_JAVA] 백준 2908번 : 상수 @달깅 (0) | 2019.11.03 |
---|---|
[BOJ_JAVA] 백준 1152번 : 단어의 개수 @달깅 (0) | 2019.11.03 |
[BOJ_JAVA] 백준 11729번 : 하노이 탑 이동 순서 @달깅 (0) | 2019.11.03 |
[BOJ_JAVA] 백준 15596번: 정수 N개의 합 @달깅 (0) | 2019.11.02 |
[BOJ_JAVA] 백준 1157번: 단어공부 @달깅 (0) | 2019.11.01 |
댓글