별찍기(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(" " ); } } }
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("" ); } } }
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(); } } }
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 ; 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("" ); } for (int i=1 ; i<n; i++) { 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("" ); } } }