별찍기(1).java

중첩 for문에 익숙해지기위해 별찍기를 연습해봤다.


1) 왼쪽, 상단에서 하단으로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
public class star_1 {
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+1; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}
// 출력 결과
// Input star length : 5
// *
// **
// ***
// ****
// *****

왼쪽에 붙어있으면서 상단에서 하단으로 내려갈수록 별이 많아지는 별 트리이다.

첫번째 for문, 즉 바깥쪽 for문은 Column에 해당한다. 입력받은 정수만큼의 별을 그대로 출력하면 되기 때문에 for(int i=0; i<len; i++) {} 를 사용했다.

두번째 for문이자 안쪽 for문은 Column을 작성하는 부분에 해당한다. 첫번째 줄(Row)부터 별이 하나씩 증가(row)하는 형태인데, 증가하는 별은 Row 수에 비례해서 증가하고 있다. 따라서 두번째 for문의 반복조건은 첫번째 for문에서 사용한 iterator i만큼 반복되어야 한다. for문 조건식에서 <= 을 사용하지 않고, < 를 사용했기 때문에 반복조건에 +1을 해서 for(int j=0; j<i+1; j++) {} 로 작성했다.

별을 찍었으면, iterator i가 증가할 때마다 줄을 바꿔야 하기 때문에 System.out.println(""); 을 바깥쪽 for문과 안쪽 for문 사이에 작성해준다.


2) 오른쪽, 상단에서 하단으로

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_3 {
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<len-i; j++) {
System.out.print(" ");
}
for(int j=0; j<i+1; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}

// 출력 결과
// Input star length: 5
// (1) *
// (2) **
// (3) ***
// (4) ****
// (5) *****

이번엔 1) 에서 했던 별을 오른쪽으로 밀어넣은 형태의 별 트리이다.

1)의 반복문이 2개를 중첩함으로써 구현했다면, 2) 부터는 반복문 1 개에 2 개의 반복문을 중첩시킴으로써 구현해야 한다. 1)에서는 신경쓰지 않아도 되었던 빈 칸을 임의로 만들어서 별의 위치를 오른쪽으로 고정시켜야 하기 때문이다. 빈 칸을 만들어내는 코드이다.

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

여기서 반복문의 조건식이 중요하다. 빈 칸은 시작점은 0에서 똑같이 시작하나, 갯수가 점차 적어지는 형조건이어야한다. 따라서 iterator j 에 사용자로부터 입력받은 최댓값(len)을 선언해주어야 한다.

그리고 한 줄씩 내려갈수록 빈칸의 갯수는 하나씩 줄어야 하므로 빈칸을 생성하는 안쪽 for문의 iterator j 의 시작 값을 j=len-i 로 만들어준다. 그러면 한 줄이 바뀔때마다 i의 값이 1씩 커지므로 이와반대로 j의 값은 1씩 줄어들면서 그 다음 for문으로 생성되는 별을 하나씩 앞당겨준다.


3) 왼쪽, 하단에서 상단으로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
public class star_3 {
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=n; j>i; j--) {
System.out.print("*");
}
System.out.println("");
}
}
}

// Input star length: 5
// (1) *****
// (2) ****
// (3) ***
// (4) **
// (5) *

별을 사용자로부터 입력된 값만큼 출력하고 빈칸을 출력하는 프로그램이다.

따라서 별을 출력하는 안쪽 첫번째 반복문은 0에서 시작해서 len-i가 될 때까지 별 출력을 반복한다. 반복조건을 len-i로 작성한 이유는 바깥쪽 반복문의 iterator i가 하나씩 증가할 때마다 별이 하나씩 줄어야 하기 때문이다.


4) 오른쪽, 하단에서 상단으로

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
import java.util.Scanner;
public class star_2 {
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++) {
System.out.print("("+(i+1)+") "); // printout line number

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

// 출력 결과
// Input star length : 5
// (1) *****
// (2) ****
// (3) ***
// (4) **
// (5) *

이번엔 반대로 3)의 별 트리를 오른쪽으로 밀어붙인 형태이다. 왼쪽이 빈 칸, 오른쪽이 별인 형태이다.

안쪽 첫번째 반복문은 빈 칸을 작성하는 반복문이고, 안쪽 두번째 반복문은 별을 작성하는 반복문이다.

안쪽 첫 번째 반복문부터 보면, 왼쪽이 빈 칸이므로 빈 칸을 작성하는 반복문을 작성하였다. 0에서 시작해서 바깥쪽 iterator i가 될 때까지 1씩 증가하는 조건으로 작성하였다.

안쪽 두 번째 반복문은 빈 칸에 이어 별이 입력되는 반복문인데, 0에서 반복조건을 k<len-i 로 작성하였다. 별 트리의 넓이를 사용자로부터 입력받은 len 에 맞추고, 줄이 바뀔 때마다 별의 갯수가 하나씩 줄어들기 때문이다.

진짜 별사진으로 눈정화하고 별찍기(2) 보러가기