728x90
1. 문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
2. 풀이
Main
1. [N][N*2]칸 boolean 배열을 만든다.(static 변수임)
2. 별 찍는 메서드를 부른다.
3. 만약 board[i][j] 가 true면 별, false면 공백을 sb에 더한다.
4. 출력한다.
static boolean[][] board;
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
board = new boolean[N][N*2];
star(0,0,N);
StringBuilder sb = new StringBuilder();
for(int i=0;i<N;i++){
for(int j=0;j<2*N;j++){
if(board[i][j]) sb.append('*');
else sb.append(' ');
}
sb.append('\n');
}
System.out.print(sb);
}
별 찍기
분할정복 방식이라고 생각하면 된다. size가 3일때를 base로 둔다.
i, j는 별을 찍어야 하는 보드의 시작지점이다.
세로로 이등분해서 윗쪽 가운데에 하나, 아랫쪽 양 옆으로 하나씩 재귀호출하면 된다.
이때 오른쪽 아래 삼각형은 i+resize, j+size가 시작지점인 것을 명심해야 한다!
private static void star(int i, int j, int size){
if(size==3){
board[i][j+2] = board[i+1][j+1] = board[i+1][j+3] = true;
for(int k=0;k<5;k++) board[i+2][j+k] = true;
return;
}
int resize = size/2;
star(i,j+resize,resize);
star(i+resize,j,resize);
star(i+resize,j+size,resize);
}
전체 코드
import java.io.*;
public class BOJ_2448_별찍기11 {
static boolean[][] board;
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(new BufferedReader(new InputStreamReader(System.in)).readLine());
board = new boolean[N][N*2];
star(0,0,N);
StringBuilder sb = new StringBuilder();
for(int i=0;i<N;i++){
for(int j=0;j<2*N;j++){
if(board[i][j]) sb.append('*');
else sb.append(' ');
}
sb.append('\n');
}
System.out.print(sb);
}
private static void star(int i, int j, int size){
if(size==3){
board[i][j+2] = board[i+1][j+1] = board[i+1][j+3] = true;
for(int k=0;k<5;k++) board[i+2][j+k] = true;
return;
}
int resize = size/2;
star(i,j+resize,resize);
star(i+resize,j,resize);
star(i+resize,j+size,resize);
}
}
3. 결과
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 1504 특정한 최단 경로 - JAVA (0) | 2023.07.18 |
---|---|
[BOJ] 13172 Σ - JAVA (0) | 2023.07.17 |
[BOJ] 15501 부당한 퍼즐 - JAVA (0) | 2023.07.15 |
[BOJ] 1238 파티 - JAVA (0) | 2023.07.14 |
[BOJ] 1918 후위 표기식 - JAVA (0) | 2023.07.13 |
댓글