728x90
문제
숫자 n이 주어졌을 때, 정해진 규칙에 맞게 별을 출력하라
접근 방식
별 찍기 10을 풀면 11을 쉽게 풀 수 있다길래 바로 도전했는데
어김없이 두들겨 맞았다...
별 찍기 문제들이 다 숫자 하나만 주고 알아서 규칙을 찾아서
규칙대로 출력하라니 정말 골 때리는 문제인 거 같다
(재귀 자체도 어려워 죽겠는데 팍C...)
그래도 이 문제까지 풀고 나니 재귀는 그냥 컴퓨터한테
믿고 맡기라는 말이 무슨 말인지 이해가 되는 거 같다
*
* *
*****
우선 n이 3인 경우를 살펴보면 알 수 있는 것들이 몇 가지 있다.
- 별은 총 3개의 층으로 규칙 없이 1, 2, 5개가 찍힌다.
- 가장 아래층은 2n - 1의 길이를 가진다.
*
* *
*****
* *
* * * *
***** *****
다음으로 6인 경우를 살펴보면 3인 경우가 3번 반복되어
위, 왼쪽 아래, 오른쪽 아래 방향으로 출력되는 것을 알 수 있다.
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
12인 경우도 마찬가지로 6인 경우가 3번 위, 왼쪽 아래, 오른쪽 아래 방향으로 출력된다.
누가 봐도 재귀로 풀 수 있는 문제인데 이게 눈과 머리로 규칙을
이해는 했지만 코드로 짜려니 머리가 터지는 줄 알았다.
결국은 길이를 절반씩 줄이면서 재귀를 반복하다
길이가 3인 경우에만 현재 지점에서 3층 짜리 별 패턴을 찍어주면 되고
재귀 호출은 위, 왼쪽 아래, 오른쪽 아래 방향으로 3번 호출해 주면 된다.
풀이
public class Main {
private static char[][] stars;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
stars = new char[n][2*n-1];
for (int i = 0; i < n; i++) {
Arrays.fill(stars[i], ' ');
}
createStar(n, 0, n - 1);
for (char[] star : stars) {
bw.write(star);
bw.write("\n");
}
bw.flush();
bw.close();
}
private static void createStar(int size, int x, int y) {
if (size == 3) {
stars[x][y] = '*';
stars[x + 1][y - 1] = '*';
stars[x + 1][y + 1] = '*';
for (int i = y - 2; i <= y + 2; i++) {
stars[x + 2][i] = '*';
}
return;
}
int newSize = size / 2;
createStar(newSize, x, y); // 위
createStar(newSize, x + newSize, y - newSize); // 왼
createStar(newSize, x + newSize, y + newSize); // 오
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 15652번 : N과 M (4) (0) | 2023.10.29 |
---|---|
[백준] 15651번 : N과 M (3) (0) | 2023.10.28 |
[백준] 2447번 : 별 찍기 - 10 (0) | 2023.10.27 |
[백준] 1992번 : 쿼드트리 (0) | 2023.10.26 |
[백준] 2630번 : 색종이 만들기 (0) | 2023.10.25 |