2447. 별 찍기-10 (G5)
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
1 초 | 256 MB | 78828 | 44240 | 33018 | 55.939 % |
문제
재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.
summary
조건에 맞춰서 별찍기
strategy
재귀 활용
- 별찍기 재귀함수 인자로 시작 좌표와 한변 사이즈를 넘겨줌 (int x, int y, int size)
- 행과 열을 3분할로 나눔 (이중for문)
- 행과 열이 1일 때는 공백인 구역으로 패스 (continue)
- 한변 사이즈가 1 이면 종료 조건으로 '*' 찍는 영역 (board[x][y] = true;)
note
- N은 3의 거듭제곱
- 1 ≤ k < 8
import java.util.*;
import java.io.*;
public class Main {
static int N;
static boolean[][] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder answer = new StringBuilder();
// input
N = Integer.parseInt(br.readLine()); // 3, 9, 27, ...
board = new boolean[N + 1][N + 1];
// logic
star(0, 0, N);
// output
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
char c = '*';
if(!board[i][j]) c = ' ';
answer.append(c);
}
answer.append("\n");
}
System.out.println(answer);
}
private static void star(int x, int y, int size) { // 분할정복 (시작 좌표와 크기)
if(size == 1) {
board[x][y] = true;
return;
}
for(int i = 0; i < 3; i++) { // 3 X 3 영역으로 나눔
for(int j = 0; j < 3; j++) {
if(i == 1 && j == 1) continue; // 가운데는 비움
star(x + (size/3 * i), y + (size/3 * j) ,size/3); // 각 영역 시작 좌표와 크기
}
}
}
}
문제 | 결과 | 메모리 | 시간 | 언어코드 | 길이 |
2447 | 맞았습니다!! | 42700 KB | 264 ms | Java 11 / 수정 | 1270 B |
memo
- 재귀 활용하는 방법이 안떠올라서 다른분 풀이 학습. 연습이 필요한거 같다
'문제 풀이 > 백준' 카테고리의 다른 글
[JAVA60] 4673. 셀프넘버 (0) | 2024.10.22 |
---|---|
[JAVA59] 2108. 통계학 (0) | 2024.10.21 |
[JAVA57] 1966. 프린터 큐 (0) | 2024.10.19 |
[JAVA56] 1065. 한수 (0) | 2024.10.18 |
[JAVA56] 1940. 주몽 (0) | 2024.10.17 |