문제
별찍는 규칙을 유추한 뒤에 별을 찍는다.
입력
첫째 줄에 N이 주어진다. (사용자 입력) n은 항상 3*2^k수이다.
출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
|
cs |
문제풀이
* Java 언어로 구현했습니다.
먼저 출력된 별 트리 모양을 보면 규칙을 발견할 수 있다.
큰 삼각형기준으로 잡고 반으로 쪼개면 위 삼각형 1개, 아래 삼각형 2개가 나온다.
첫번째로 재귀함수로 푼다면 간단하게 풀 수 있다는 것을 유추할 수 있다.
재귀함수의 대표문제 하노이 탑을 아래 그림과 같이 큰 단위에서 작은 단위로 쪼개면서 생각해보면 된다.
두번째로 높이는 n (사용자가 입력한 값) 가로는 2n -1인것을 알 수 있다.
이 범위를 가지는 2차원 배열을 선언해서 * 값이 해당되지 않는 부분은 공백을 채워둔다.
import java.util.Scanner;
public class beack_2448 {
private static char[][] map;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
map = new char[n][2 * n - 1];
for (int i = 0; i<n; i++)
for (int j = 0; j < 2*n-1; j++)
map[i][j] = ' ';
drawStar(0, n-1, n);
for (int i = 0; i<n; i++) {
for (int j = 0; j < 2*n-1; j++)
System.out.print(map[i][j]);
System.out.println();
}
}
private static void drawStar(int x, int y, int n) {
if (n == 3) {
map[x][y] = '*';
map[x + 1][y - 1] = map[x + 1][y + 1] = '*';
map[x + 2][y - 2] = map[x + 2][y - 1] = map[x + 2][y] = map[x + 2][y + 1] = map[x + 2][y + 2] = '*';
return;
}
drawStar(x, y, n / 2);
drawStar(x + n / 2, y - n / 2, n / 2);
drawStar(x + n / 2, y + n / 2, n / 2);
}
}
'Algorithm > Java' 카테고리의 다른 글
[Java]백준 8958번 :: OX퀴즈 (0) | 2018.12.25 |
---|---|
[Java]백준 1780번 :: 종이의 개수 (0) | 2018.10.28 |
[Java]백준 1992번 :: 쿼드트리 (2) | 2018.10.28 |
[Java]백준 4344번 :: 평균은 넘겠지 (0) | 2018.07.05 |
[Java]백준 15552 :: 빠른 A+B (0) | 2018.07.05 |
댓글