반응형
🅰 백준 2448. 별찍기 11
2448번: 별 찍기 - 11
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
www.acmicpc.net
✏️ 문제 풀이
- 재귀를 이용하여 삼각형을 3등분을 한 다음 같은 모양의 삼각형을 찍어주었다.
- 일단 삼각형을 프린트 할 수 있는 함수를 하나 생성하고, 재귀함수를 생성해주었다.
- 재귀함수 내에서는 N==3(삼각형 높이가 3)이 될때까지 재귀를 돌린 후 프린트함수를 통해 배열에 저장을 해주었다.
- 시작 꼭지점을 기준으로 삼각형을 3등분 해주었다.
- star(N / 2, x, y); //중심
star(N / 2, x + N / 2, y + N / 2); //좌
star(N / 2, x + N / 2, y - N / 2); //우
✏️ 소스코드
package divideandconquer;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main_골드4_2448_별찍기11 {
private static StringBuilder sb = new StringBuilder();
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private static char map[][];
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
map = new char[N][N * 2 - 1];
//출력할 때 null문자가 아닌 ' '공백이 들어가서 출력을 해야 답이 맞다고 한다.
for (int j = 0; j < N; j++) {
for (int i = 0; i < N * 2 - 1; i++) {
map[j][i] = ' ';
}
}
star(N, 0, N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N * 2 - 1; j++) {
bw.append(map[i][j]);
}
bw.append('\n');
}
bw.flush();
bw.close();
}
//재귀 구현
private static void star(int N, int x, int y) {
if (N == 3) {
print(x, y);
return;
}
star(N / 2, x, y);
star(N / 2, x + N / 2, y + N / 2);
star(N / 2, x + N / 2, y - N / 2);
}
private static void print(int x, int y) {
map[x][y - 1] = '*';
map[x + 1][y - 2] = '*';
map[x + 1][y] = '*';
for (int i = -3; i < 2; i++) {
map[x + 2][y + i] = '*';
}
}
}
✅ 후기
- 괜히 골드가 아니였다,, 규칙은 찾았으나 아직 재귀로 구현하는 부분이 부족한 것 같다. 더 공부해서 별찍기 마스터 해야겠다.
반응형
'백준 > 분할정복' 카테고리의 다른 글
백준 1780. 종이의 개수 (0) | 2021.09.06 |
---|---|
백준 2447. 별찍기 10 (0) | 2021.09.06 |
백준 11728. 배열합치기 (0) | 2021.09.06 |
백준 10816. 숫자카드2 (0) | 2021.09.06 |
백준 1074. Z (0) | 2021.09.05 |
댓글