BOJ

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

yujinkimkim 2023. 7. 2. 13:34

2447번: 별 찍기 - 10 (acmicpc.net)

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

package baekjoon;
import java.io.*;
import java.util.*;

public class b2447 {
	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 flag) {
 
		if (flag) {
			for (int i = x; i < x + N; i++) {
				for (int j = y; j < y + N; j++) {
					arr[i][j] = ' ';
				}
			}
			return;
		}

		if (N == 1) {
			arr[x][y] = '*';
			return;
		}
 
		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) { 
					star(i, j, size, true);
				} else {
					star(i, j, size, false);
				}
			}
		}
	}
}

이중포문으로 그냥 메인에서 막 하려했는데 짜면 짤수록 포문이 늘어야할 거 같아서 계속 손보다가 알바 준비할 시간 슬슬 돼서 일단 급해서 구글링해서 이해만이라도 빨리 하고 일단 올릴게요 ㅜㅜ 다녀와서 설명 추가하겠슴니다ㅠ  ㅠ

아예 복붙은 오바라 출력방법이라도 바꿔보려했는데

system머시기로 하면 시간초과 나서 스트링버퍼로 해야하네요 

[백준] 2447번 : 별 찍기 - 10 - JAVA [자바] (tistory.com)

 

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

 

st-lab.tistory.com

이 선생님 글을 참고했슴니다


약속의 날이 밝았네요

[백준] 2447번 별 찍기 10 - Java :: 멈추지않긔 (tistory.com)

 

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

문제 코드 맞았습니다가 뜬 코드입니다. - 메모리 16784KB | 시간 556ms | 코드 길이 745B import java.io.*; public class Main { private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); private stati

cuckoobird.tistory.com

언니 글 보고 감명받아서 인용했습니다(좀많이)

package baekjoon;
import java.io.*;
import java.util.*;

public class b2447 {
	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];
		for(int i = 0 ; i < N ; i++)
			Arrays.fill(arr[i], '*');
		
		for(int k = 0 ; k < Math.cbrt(N); k++)
		{   
			for(int i = 0 ; i < N ; i++)
			{
				for(int j = 0 ; j < N ; j++)
				{
				
				if((int)(i / Math.pow(3, k)) % 3== 1 && (int)(j / Math.pow(3, k)) % 3 == 1)
					arr[i][j] = ' ';					
				}
			}
		}
		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);
		
		
	}
}

3세트로 나눴을 때 계속 가운데가 뚫려있어야하는거를 3으로 나눴을 때 1이냐로 본건데

3세트 단위가 계속 바뀌어야하는데

그게 

작게는 1로 나눈거랑 크게는 9로 나눈거까지로 봐야해서

세제곱근까지로 포문 한번 크게 더 돌리고

if문에서는 k만큼 제곱한걸로 나눈 몫의 나머지가 1이냐로 봐서 공백 넣어준건데

연산도 너무 많고 재귀를 안 써서 좀 그런 코드지만

처음 원했던 느낌대로 푼 거 같아서 좋네요 ㅎㅎ

시간 차이 레젼두네요..