별찍기(2).java

별찍기(1).java 보고오기

5) bottom-up 하프 별 트리

크리스마스 트리모양으로 별이 아래로 갈수록 2개씩 증가하는 형태이다.

반복문은 중첩반복문 2개가 필요해보인다. 왼쪽에서 부터 공백을 채우는 중첩반복문과 *을 찍는 중첩반복문. 먼저 별 트리의 왼쪽 공백을 채우는 코드이다.

1
2
3
4
5
6
for (int i = 0; i < len; i++) {
for (int j = 1; j < len-i; j++) {
System.out.print(" ");
}
...
}

별을 찍는 조건은 조금 복잡하다(?) 별의 갯수가 하나씩 증가하는게 아니라 (len*i)-1만큼 증가하기 때문에 중첩반복문의 조건에도 이 조건을 포함해야 한다. 다만, (len*i)-1의 조건을 그대로 사용할 경우 len층 트리가 아니라 len-1층 트리가 출력된다. 첫번째 줄에서 별이 출력되지 않았기 때문이다. 따라서 i에 1을 추가하여 (len*(i+1))-1로 조건을 변경해야 한다.

1
2
3
4
5
6
7
for (int i = 0; i < len; i++) {
...
for (int j = 1; j < (2*(i+1))-1; j++) {
System.out.print("*");
}
...
}

그리고 이 공백이 끝나는 지점에서부터 (i2)+1까지 증가하는 반복문으로 \를 채워나간다. 마지막으로 줄을 띄우는 print문을 함으로써 반복문 작성을 마친다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.Scanner;

public class star_5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

System.out.print("Input star length: ");
int len = sc.nextInt();

for (int i = 0; i < len; i++) {
for (int j = 1; j < num-i; j++) {
System.out.print(" ");
}
for (int j = 1; j < (2*(i+1))-1; j++) {
System.out.print("*");
}
System.out.println(" ");
}
}
}

// Input star length: 5
// *
// ***
// *****
// *******
// *********

6) top-down 하프 별 트리

중첩반복문 2개가 사용된다.

먼저 왼쪽의 공백을 작성하는 중첩반복문을 보자. 0에서부터 시작해서 전체 반복문의 iterator만큼 증가시킨다.

1
2
3
4
5
6
for (int i = 0; i < len; i++) {
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
...
}

그리고 이 지점에서부터 *을 찍어야 한다. *은 0부터 시작해서 (2*len)-1까지 증가시키며 row가 하나씩 늘어날수록 *이 (i*2)만큼 줄어들어야 하므로 조건식에 들어갈 식은 (2*len)-1-(i*2)가 되어야한다.

1
2
3
4
5
6
7
for (int i = 0; i < len; i++) {
...
for (int j = 0; j < (2*len)-1-(i*2); j++) {
System.out.print("*");
}
...
}

전체 작성은 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Scanner;
public class star_6 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

System.out.print("Input star length: ");
int len = sc.nextInt();

for(int i=0; i<len; i++) {
for(int j=0; j<i; j++) {
System.out.print(" ");
}
for(int j = 0; j < (2*len)-1-(i*2); j++) {
System.out.print("*");
}
System.out.println("");
}
}
}

// Input star length: 5
// *********
// *******
// *****
// ***
// *

7) 다이아몬드형 별

다이아몬드 형태의 별은 두개로 나뉘어서 보면 좋다. 별 트리의 허리에 해당하는 별의 길이가 이 트리의 전체 row에 해당하는데, 이 row를 기준으로 나누어서 보면 편하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.Scanner;
public class star_7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

int num = sc.nextInt();

for (int i = 0; i < num; i++) {
for (int j = 1; j < num-i; j++) {
System.out.print(" ");
}
for (int j = 1; j <= (2*(i+1))-1; j++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 1; i < num; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(" ");
}
for (int j = 0; j < (2*num)-1-(2*i); j++) {
System.out.print("*");
}
System.out.println();
}
}
}

// Input star length: 5
// *
// ***
// *****
// *******
// *********
// *******
// *****
// ***
// *

8. 모래시계형 별

이번에도 5)의 트리와 6)의 트리를 활용해서 만들 수 있다. 이번에도 입력값을 수정해서 출력해야 하는데, 7)과는 달리 입력값을 2로 나눈후 +1을 해야한다. 이렇게 해야 트리의 위/아래에 입력값으로 받은만큼의 별 문자열을 출력할 수 있다.

그리고 어떤 길이를 받던 결국 중간의 별 문자열은 별 하나만 와야 하는데, 이 때 5)와 6)의 코드를 그대로 가져다 사용하면 별 하나짜리 문자열이 2개가 중복될 수 있다. 따라서 5)또는 6)의 코드를 수정해야 한다. 아래 코드는 5)의 코드를 수정해서 작성해보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.Scanner;
public class star_8 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);

System.out.print("Input star length: ");
int len = sc.nextInt();
int n = (len/2)+1;


// 6) top-down 별 트리
for(int i=0; i<n; i++) {
for(int j=0; j<i+1; j++) {
System.out.print(" ");
}
for(int j=0; j<n-i; j++) {
System.out.print("*");
}
for(int j=1; j<n-i; j++) {
System.out.print("*");
}
System.out.println("");
}
// 5) bottom-up 별 트리
for(int i=1; i<n; i++) {
// iterator의 시작을 1에서 시작함으로써 중간 중복을 제거
for(int j=n-i; j>0; j--) {
System.out.print(" ");
}

for(int j=0; j<i+1; j++) {
System.out.print("*");
}

for(int j=0; j<i; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}

// Input star length: 5
// *****
// ***
// *
// ***
// *****