-
[백준] 2447번 : 별 찍기 - 10 - 자바(JAVA)알고리즘/백준 2022. 8. 1. 00:01
https://www.acmicpc.net/problem/2447
문제 해석
재귀함수를 활용하여 별을 찍는 문제 같습니다.
분할정복 느낌으로 사각형 크기가 3인 사각형을 확장해 나가는 것 같습니다.
문제 풀이 전 설계
재귀함수의 반복은 N=3일때까지 반복을 합니다. (가장 작은 단위가 N=3일때 )
만약 N=9가 들어오게 된다면 위 사각형 그리기, 가운데 공백있는 사각형 그리기, 아래 사각형 그리기로 나뉘어 재귀함수를 호출해야 할 것 같습니다.
재귀함수(){ if(N==3){ 제일 작은 사각형 만들기 return } 위사각형() 가운데사각형() 아래사각형() }
초반 설계와는 다르게 N==1일때만 별을 찍어주고, 가운데부분 공백은 i==1, j==1일때 넘어가는 방식을 통해서 빈칸은 제외시켜줬습니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main_2447_별찍기10 { static char[][] board; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); board = new char[N][N]; for (int i = 0; i < N; i++) { Arrays.fill(board[i], ' '); } makeRect(N, 0, 0); printBoard(N); } public static void makeRect(int N, int y, int x) { if (N == 1) board[y][x] = '*'; else { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == 1 && j == 1) ; else makeRect(N / 3, y + N / 3 * i, x + N / 3 * j); } } } } private static void printBoard(int N) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { sb.append(board[i][j]); } sb.append("\n"); } System.out.println(sb.toString()); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 18870번 : 좌표 압축 - 자바(JAVA) (0) 2022.08.07 [백준] 1865번: 웜홀 - 자바(JAVA) (0) 2022.08.04 [백준] 3078번 : 좋은 친구 - 자바(JAVA) (0) 2022.07.30 [백준] 16500번 : 문자열 판별 - 자바(Java) (0) 2022.07.29 [백준] 20303번 : 할로윈의 양아치 - 자바(JAVA) (0) 2022.07.27