-
[백준] 2448번 : 별 찍기 - 11 - 자바(JAVA)알고리즘/백준 2022. 7. 20. 00:01
https://www.acmicpc.net/problem/2448
문제 해석
주어진 규칙에 따라 별을 찍는 문제입니다.
첫 번째 줄부터 N번째 줄까지 별을 출력합니다
다음은 N = 24일 때 예시입니다.
삼각형 모양이며 중앙에는 역삼각형으로 비어있습니다.
문제 풀이 전 설계
유의미한 규칙을 찾아보려고 합니다.
공백을 기준으로
마지막 줄에는 공백이 0개
N-1번째 줄에는 공백기 1개
N-2번째 줄에는 공백기 2개
....
두번째줄에는 공백이 N-2개
첫 번째 줄에는 공백이 N-1개
삼각형을 기준으로
전체 삼각형에서 작은 삼각형 3개로 분리됩니다.
또 이 작은 삼각형은 더 작은 삼각형 3개로 분리됩니다.
이 삼각형은 또 더 작은 삼각형 3개로 분리됩니다.
이 과정이 더 이상 쪼개질 수 없는 삼각형 1개가 될 때까지 반복합니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main_2448_별찍기11 { static Character[][] map; static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int width = N*2-1; map = new Character[N][width]; //N=3일때 3*5 행렬 //N=6일때 3*11 행렬 //N=12일때 3*23 행렬 //모두 공백문자로 초기화 세팅 for(int i=0; i<N; i++){ Arrays.fill(map[i], ' '); } makeStar(0, N-1, N); for(int i=0; i<N; i++){ for(int j=0; j< width; j++){ sb.append(map[i][j]); } sb.append("\n"); } System.out.println(sb.toString()); } private static void makeStar(int row, int col, int n) { //가장 작은 패턴의 단위 if(n==3){ map[row][col] = '*'; map[row+1][col+1] = map[row+1][col-1] = '*'; map[row+2][col-2] = map[row+2][col-1] = map[row+2][col] = map[row+2][col+1] = map[row+2][col+2] = '*'; return; } //그게 아니라면 , 더 작은 단위로 3개 쪼개주기 int cnt = n/2; //맨 위 삼각형 makeStar(row,col,cnt); //오른쪽 삼각형 makeStar(row + cnt, col + cnt, cnt); //왼쪽 삼각형 makeStar(row + cnt, col - cnt, cnt); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1615번 : 교차개수세기 - 자바(Java) , C++ (0) 2022.07.26 [백준] 2015번 : 수들의 합4 - 자바(JAVA) (0) 2022.07.21 [백준] 9466번 : 텀 프로젝트 - 자바(JAVA) (0) 2022.07.16 [백준] 1976번 : 여행 가자 - 자바(JAVA) (0) 2022.07.14 [백준] 3687번 : 성냥개비 - 자바(JAVA) (0) 2022.07.13