[JAVA] 백준 2447번 - 별 찍기 10
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이냐로 봐서 공백 넣어준건데
연산도 너무 많고 재귀를 안 써서 좀 그런 코드지만
처음 원했던 느낌대로 푼 거 같아서 좋네요 ㅎㅎ