알고리즘
[백준] 2447번 : 별 찍기 - 10 _ JAVA ( 주석 설명 ) 본문
1번
→
어려웠다.
3*3 패턴을 만든 뒤 규칙에 따라 StringBuilder에 append 하려고 했는데,
개행 때문에 옆에 나란히 붙일 수는 없었다.
1시간동안 고민했지만, 해결 방법이 떠오르지 않아 아래 자료를 참고했다.
-
규칙(5번째 인덱스마다 공백이다.) 을 찾고
function(탐색 시작 행 : row, 탐색 시작 열 : column, 탐색할 범위 : N, 공백 판단 T/F : false) 을 만드는 문제이다.
재귀를 풀 때, 함수로 만들 규칙을 정확히 찾고 그 규칙을 구현하는 연습이 필요할 것 같다.
[백준] 2447번 : 별 찍기 - 10 - JAVA [자바]
st-lab.tistory.com
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static char[][] ary;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //빠른 출력을 위한 버퍼 활용
int N = Integer.parseInt(br.readLine()); //3의 배수로, 패턴의 크기 N을 입력받는다.
ary = new char[N][N]; //크기만큼의 2차원 배열을 생성한다.
star(0,0,N,false); //시작은 0, 0 이다.
StringBuilder sb = new StringBuilder(); //출력을 위한 StringBuilder를 생성한다.
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
sb.append(ary[i][j]);
}
sb.append('\n');
}
System.out.println(sb); //크기 N의 패턴을 출력한다.
}
private static void star(int row, int column, int N, boolean blank) {
//공백일 경우
if(blank){
//함수 입력 좌표에서부터 N*N까지 공백을 출력한다.
for(int i=row;i<row+N;++i){
for(int j=column;j<column+N;++j){
ary[i][j] = ' ';
}
}
//함수 리턴을 종료하기 위해 return을 사용해주어야 한다.
return;
}
//더 이상 쪼갤 수 없을 때 -> * 출력
if(N==1){
ary[row][column] = '*';
//함수 리턴을 종료하기 위해 return을 사용해주어야 한다.
return;
}
int size = N/3; //이 문제는 N/3 의 정사각형으로 감싸주기에 범위의 규칙을 사용한다.
int count = 0; //항상 5번째에 공백이 생기므로, 그 카운팅을 세야 한다.
for(int i=row;i<row+N;i+=size){
for(int j=column;j<column+N;j+=size){
count++;
if(count==5){ //해당 시작 꼭짓점을 중심으로 N/3만큼의 공백을 생성한다.
star(i,j,size,true);
}
else{ //해당 시작 꼭짓점을 중심으로 N/3만큼의 *을 생성한다.
star(i,j,size,false);
}
}
}
}
}
'백준 - JAVA > 재귀' 카테고리의 다른 글
[백준] 11729번 : 하노이 탑 이동 순서 _ JAVA ( 주석 설명 ) (0) | 2023.02.14 |
---|---|
[백준] 25501번 : 재귀의 귀재 _ JAVA ( 주석 설명 ) (0) | 2023.02.10 |
[백준] 10870번 : 피보나치 수 5 _ JAVA ( 주석 설명 ) (0) | 2023.02.10 |
[백준] 10872번 : 팩토리얼 _ JAVA ( 주석 설명 ) (0) | 2023.02.10 |