yunyj99
라둥이
yunyj99
GitHub
전체 방문자
오늘
어제
  • 분류 전체보기 (309)
    • 1. 프로그래밍 (50)
      • 1-1. Git (17)
      • 1-2. Java (13)
      • 1-2-1. Java GUI (1)
      • 오류 (12)
      • 기타 (7)
    • 2. Front-end (57)
      • 2-1. HTML (5)
      • 2-2. CSS (19)
      • 2-3. Java Script (33)
      • 2-4. React (0)
    • 3. Back-end (47)
      • 3-1. Spring MVC - 국비 (15)
      • 3-2. Spring MVC - 남궁성 (30)
      • 3-3. Spring - 김영한 (2)
    • 4. Android (1)
    • 5. DB (20)
      • 4-1. MySQL DBMS (20)
    • 6. 자료구조 & 알고리즘 (44)
      • 6-1. 자료구조 (14)
      • 6-2. 백준 (30)
    • 7. 웹 디자인 (7)
      • 7-1. UX 디자인 (7)
    • 8. 자격증 (35)
      • 8-1. 정보처리기사 (35)
    • 프로젝트 (3)
      • 프로젝트 기록 (3)
    • etc... (43)
      • 패스트캠퍼스 챌린지 (39)
      • 잡담 (4)

블로그 메뉴

  • 홈
  • 태그

최근 글

티스토리

hELLO · Designed By 정상우.
yunyj99

라둥이

쓰기
6. 자료구조 & 알고리즘/6-2. 백준

백준 - [2447번: 별 찍기 - 10]

2022. 6. 21. 12:34

별 찍기 - 10 

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

 

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

 

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

 

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

예제 입력 1 

27

예제 출력 1 

***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

 


먼저 내가 처음 푼 방식.

받아온 크기 n만큼 이중배열 생성 후 ' * '로 채워주었다.

 

그리고 drawStar 함수를 이용했는데 4중 for문이 나왔다(...)

어쨌든.. 매개변수의 seq는 블럭의 크기를 나타낸다. 처음엔 n과 같은 크기로 시작해서 3이 될 때까지 seq/3을 넣어서 drawStar 다시 호출하도록 했다.

 

반복문을 보면 우선 안쪽의 j, i 반복문은 해당 블럭 크기안에서 공백( 공백은 seq / 3 크기임 )을 넣는다. 즉 n=27,seq=27 이면 27 사이즈의 블럭안에 27/3 즉 9*9 사이즈의 공백을 찍고, n=27, seq=9 이면 9 사이즈의 블럭 안쪽에 3*3 사이즈의 공백을 찍는다.

 

바깥쪽 z,k 반복문은 전체 크기의 블럭(n)에 해당 블럭 크기(seq)만큼 반복해서 공백을 찍도록 한다. 즉 n=27,seq=27 이면 27사이즈 블럭 안에 (27/3) 9*9 사이즈 공백을 한번만 찍고, n=27, seq=9 이면 9 사이즈의 블럭 안에 3*3 사이즈의 공백을 27사이즈 블럭 안에 9번 모두 찍도록 한다.

 

결과는 StringBuilder를 이용해 출력되도록 했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int n = Integer.parseInt(br.readLine());
		char[][] stars = new char[n][n];

		for (int i = 0; i < n; i++) {
			Arrays.fill(stars[i], '*');
		}

		drawStar(n, stars, n);

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				sb.append(stars[i][j]);
			}
			sb.append("\n");
		}

		System.out.println(sb);
		br.close();
	}

	public static void drawStar(int n, char[][] stars, int seq) {
		for (int z = 0; z < n / seq; z++) {
			for (int k = 0; k < n / seq; k++) {
				for (int j = seq / 3 + z * seq; j < seq / 3 + z * seq + seq / 3; j++) {
					for (int i = seq / 3 + k * seq; i < seq / 3 + k * seq + seq / 3; i++) {
						stars[j][i] = ' ';
					}
				}
			}
		}

		if (seq > 3) {
			drawStar(n, stars, seq / 3);
		}
	}


}

 

 


다음으로 다른 분들 코드를 참조해서 풀어볼랬는데 코드만 보니까 어떻게 푸신건지 잘 이해가 안가서 구글링했는데

https://st-lab.tistory.com/95

 

[백준] 2447번 : 별 찍기 - 10 - JAVA [자바]

www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백..

st-lab.tistory.com

이 분이 되게 잘 설명해 놓으셨다!!!!

 

이해하기 쉽도록 중간에 출력문을 찍어놓았다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
	static char[][] arr;
 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
 
		arr = new char[N][N];
        
		star(0, 0, N, false);
 
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				sb.append(arr[i][j]);
			}
			sb.append('\n');
		}
		System.out.print(sb);
	}
 
	static void star(int x, int y, int N, boolean blank) {
 
		// 공백칸일 경우
		if (blank) {
			System.out.println("공백칸임 --1");
			for (int i = x; i < x + N; i++) {
				for (int j = y; j < y + N; j++) {
					arr[i][j] = ' ';
					System.out.println("arr["+i+"]["+j+"] = ' '");
				}
			}
			System.out.println("공백칸끝 --1");
			return;
		}
 
		// 더이상 쪼갤 수 없는 블록일 때
		if (N == 1) {
			arr[x][y] = '*';
			return;
		}
 
		/*
		   N=27 일 경우 한 블록의 사이즈는 9이고, 
		   N=9 일 경우 한 블록의 사이즈는 3이듯
		   해당 블록의 한 칸을 담을 변수를 의미 size
           
		   count는 별 출력 누적을 의미
		 */
 
		int size = N / 3;
		int count = 0;
		for (int i = x; i < x + N; i += size) {
			for (int j = y; j < y + N; j += size) {
				count++;
				if (count == 5) { // 공백 칸일 경우
					System.out.println("star("+i+", "+j+", "+size+", true) 호출 start");
					star(i, j, size, true);
					System.out.println("star("+i+", "+j+", "+size+", true) 호출 end");
				} else {
					System.out.println("star("+i+", "+j+", "+size+", false) 호출 start");
					star(i, j, size, false);
					System.out.println("star("+i+", "+j+", "+size+", false) 호출 end");
				}
			}
		}
	}
}

 


 

'6. 자료구조 & 알고리즘 > 6-2. 백준' 카테고리의 다른 글

백준 - [1018번: 체스판 다시 칠하기]  (0) 2022.06.27
백준 - [2793번: 블랙잭]  (0) 2022.06.23
백준 - [4948번: 베르트랑 공준]  (0) 2022.06.19
백준 - [1929번: 소수 구하기]  (0) 2022.06.19
백준 - [11653번: 소인수분해]  (0) 2022.06.19
    '6. 자료구조 & 알고리즘/6-2. 백준' 카테고리의 다른 글
    • 백준 - [1018번: 체스판 다시 칠하기]
    • 백준 - [2793번: 블랙잭]
    • 백준 - [4948번: 베르트랑 공준]
    • 백준 - [1929번: 소수 구하기]
    yunyj99
    yunyj99
    개발자를 목표로 하는, 새싹처럼 성장하고 싶은 사람의 학습 공간 ^v^

    티스토리툴바