[BOJ] 2447번 별찍기-10
개요
’ * ‘문자를 이용해 속이 버어있는 사격형을 찍는 문제
코드
import java.io.*;
public class Baekjoon2447 {
public static char[][] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
arr = new char[n][n];
//배열 공백으로 초기화
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
arr[i][j] = ' ';
}
}
star(n,0,0);
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
bw.write(arr[i][j]);
}
bw.write("\n");
}
bw.flush();
}
public static void star(int n, int row, int col) {
if(n == 3) {
arr[row][col] = '*';
arr[row][col+1] = '*';
arr[row][col+2] = '*';
arr[row+1][col] = '*';
arr[row+1][col+2] = '*';
arr[row+2][col] = '*';
arr[row+2][col+1] = '*';
arr[row+2][col+2] = '*';
}
else {
star(n/3,row,col);
star(n/3,row,col+(n/3));
star(n/3,row,col+2*(n/3));
star(n/3,row+(n/3),col);
star(n/3,row+(n/3),col+2*(n/3));
star(n/3,row+2*(n/3),col);
star(n/3,row+2*(n/3),col+(n/3));
star(n/3,row+2*(n/3),col+2*(n/3));
}
}
}
해결 과정
일단 재귀로 파고들 최소단위를 정하는데 나는 3x3크기의 사각형을 최소단위로 정했다.
위 사진을 보면 사각형이 맨윗줄 3개 중간 2개 아래줄 3개로 이루어진다. 이걸 바탕으로 재귀함수를 짜면 다음과 같다. 사각형의 기준 좌표는 왼쪽 위이다.
public static void star(int n, int row, int col) {
if(n == 3) {
arr[row][col] = '*';
arr[row][col+1] = '*';
arr[row][col+2] = '*';
arr[row+1][col] = '*';
arr[row+1][col+2] = '*';
arr[row+2][col] = '*';
arr[row+2][col+1] = '*';
arr[row+2][col+2] = '*';
}
else {
star(n/3,row,col);
star(n/3,row,col+(n/3));
star(n/3,row,col+2*(n/3));
star(n/3,row+(n/3),col);
star(n/3,row+(n/3),col+2*(n/3));
star(n/3,row+2*(n/3),col);
star(n/3,row+2*(n/3),col+(n/3));
star(n/3,row+2*(n/3),col+2*(n/3));
}
}
댓글남기기