2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net


 

  • 생각

이 문제처럼 반복되는 모양의 구조를 "프랙탈 구조"라고 한다.

반복되는 구조를 잘 파악하는 것이 핵심이다.

 

똑같은 모양을 가지고 구조를 만들기 때문에 첫 모양은 규칙을 찾으려 하지 말고 임의로 생성해준다.

    *   
   * * 
  *****

 

반복되는 모양을 만들어준 뒤 작은 수부터 규칙을 찾아나가며 풀면 될 것 같다.

  • 코드

정답 코드 : 반복되는 구조를 파악한 뒤 작은 수부터 규칙을 찾아나가며 풀면 되는 문제이다.

 

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());
		}
	}
}

 

 

+ Recent posts