- 생각
이 문제처럼 반복되는 모양의 구조를 "프랙탈 구조"라고 한다.
반복되는 구조를 잘 파악하는 것이 핵심이다.
똑같은 모양을 가지고 구조를 만들기 때문에 첫 모양은 규칙을 찾으려 하지 말고 임의로 생성해준다.
*
* *
*****
반복되는 모양을 만들어준 뒤 작은 수부터 규칙을 찾아나가며 풀면 될 것 같다.
- 코드
정답 코드 : 반복되는 구조를 파악한 뒤 작은 수부터 규칙을 찾아나가며 풀면 되는 문제이다.
import java.awt.List;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N;
static StringBuilder sb;
public static void main(String[] args) throws Exception {
SetData();
System.out.println(sb);
}
private static void SetData() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
ArrayList<String> printingStart = new ArrayList<>();
// N이 3일때 세팅
printingStart.add(" * ");
printingStart.add(" * * ");
printingStart.add("*****");
// N => 3*2^k, 3, 6, 12, 24, 48, ... 이니깐 k가 1번째, 2번째 를 나타냄
for (int k = 1; 3 * (int) Math.pow(2, k) <= N; k++) { // 6입력부터 루프 실행
setStar(printingStart);
}
for (String s : printingStart) {
sb.append(s + "\n");
}
}
private static void setStar(ArrayList<String> printingStart) {
StringBuilder s = new StringBuilder();
StringBuilder s2 = new StringBuilder();
int size = printingStart.size();
for (int i = 0; i < size; i++) {
s.delete(0, s.length());
// 전 단계의 그림을 아래 하나, 옆 하나 이렇게 총 2개 복사
s.append(printingStart.get(i)); // 전 단계의 그림
s.append(" "); // 공백
s.append(printingStart.get(i)); // 전 단계의 그림
printingStart.add(s.toString());
// 전 단계 그림의 왼쪽, 오른쪽에 공백 추가
s2.delete(0, s.length());
for (int j = 0; size > j; j++) {
s2.append(" ");
}
printingStart.set(i, s2.toString() + printingStart.get(i) + s2.toString());
}
}
}
'algorithm' 카테고리의 다른 글
[BOJ/JAVA] 백준 17142번 : 연구소 3 (0) | 2021.01.05 |
---|---|
[BOJ/JAVA] 백준 1339번 : 단어 수학 (0) | 2021.01.04 |
[JAVA] 백준(BOJ) 1941번 : 소문난 칠공주 (0) | 2020.12.23 |
[JAVA] 백준(BOJ) 9466번 : 텀 프로젝트 (0) | 2020.12.23 |
[JAVA] 백준 2583번 : 영역 구하기 (0) | 2020.12.22 |