공부하기/백준

[Java] 백준 풀기 2448 - 별 찍기 11

XEV 2024. 6. 30. 23:27

자바 백준 2448번

골드 4

https://www.acmicpc.net/problem/2448

 

 

 

 

 

문제 보기

분류: 재귀

 

 

 

 

 

코드 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static char[][] map; // 별을 저장할 2차원 문자 배열
public static void main(String[] args) throws IOException {
// 입력을 받기 위한 BufferedReader 생성
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 줄에 입력된 N을 정수로 변환하여 저장
int N = Integer.parseInt(br.readLine());
// N x (2*N - 1) 크기의 2차원 배열을 생성
map = new char[N][2 * N - 1];
// 배열을 공백 문자로 초기화
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2 * N - 1; j++) {
map[i][j] = ' '; // 모든 위치에 공백 문자를 채움
}
}
// 첫 번째 별 패턴을 그리기 위한 재귀 함수 호출
drawStars(0, N - 1, N);
// 출력 결과를 저장할 StringBuilder 생성
StringBuilder sb = new StringBuilder();
for (char[] line : map) {
sb.append(line).append('\n'); // 각 줄을 StringBuilder에 추가
}
// 최종 결과 출력
System.out.print(sb);
}
// 별을 그리는 재귀 함수
private static void drawStars(int x, int y, int n) {
if (n == 3) { // 기본 패턴인 높이 3의 삼각형을 그림
map[x][y] = '*'; // 첫 번째 줄의 중앙
map[x + 1][y - 1] = '*'; // 두 번째 줄의 왼쪽
map[x + 1][y + 1] = '*'; // 두 번째 줄의 오른쪽
map[x + 2][y - 2] = '*'; // 세 번째 줄의 가장 왼쪽
map[x + 2][y - 1] = '*'; // 세 번째 줄의 왼쪽 두 번째
map[x + 2][y] = '*'; // 세 번째 줄의 중앙
map[x + 2][y + 1] = '*'; // 세 번째 줄의 오른쪽 두 번째
map[x + 2][y + 2] = '*'; // 세 번째 줄의 가장 오른쪽
} else {
int m = n / 2; // 현재 삼각형을 반으로 나눈 크기
drawStars(x, y, m); // 위쪽 중앙 삼각형
drawStars(x + m, y - m, m); // 왼쪽 아래 삼각형
drawStars(x + m, y + m, m); // 오른쪽 아래 삼각형
}
}
}
/*
예제 입력 1
24
예제 출력 1
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
*/