중첩 for문에 익숙해지기위해 별찍기를 연습해봤다.
1) 왼쪽, 상단에서 하단으로
1 | import java.util.Scanner; |
왼쪽에 붙어있으면서 상단에서 하단으로 내려갈수록 별이 많아지는 별 트리이다.
첫번째 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 | import java.util.Scanner; |
이번엔 1) 에서 했던 별을 오른쪽으로 밀어넣은 형태의 별 트리이다.
1)의 반복문이 2개를 중첩함으로써 구현했다면, 2) 부터는 반복문 1 개에 2 개의 반복문을 중첩시킴으로써 구현해야 한다. 1)에서는 신경쓰지 않아도 되었던 빈 칸을 임의로 만들어서 별의 위치를 오른쪽으로 고정시켜야 하기 때문이다. 빈 칸을 만들어내는 코드이다.
1 | for(int i=0; i<len; i++) { |
여기서 반복문의 조건식이 중요하다. 빈 칸은 시작점은 0에서 똑같이 시작하나, 갯수가 점차 적어지는 형조건이어야한다. 따라서 iterator j
에 사용자로부터 입력받은 최댓값(len
)을 선언해주어야 한다.
그리고 한 줄씩 내려갈수록 빈칸의 갯수는 하나씩 줄어야 하므로 빈칸을 생성하는 안쪽 for문의 iterator j
의 시작 값을 j=len-i
로 만들어준다. 그러면 한 줄이 바뀔때마다 i
의 값이 1씩 커지므로 이와반대로 j
의 값은 1씩 줄어들면서 그 다음 for문으로 생성되는 별을 하나씩 앞당겨준다.
3) 왼쪽, 하단에서 상단으로
1 | import java.util.Scanner; |
별을 사용자로부터 입력된 값만큼 출력하고 빈칸을 출력하는 프로그램이다.
따라서 별을 출력하는 안쪽 첫번째 반복문은 0에서 시작해서 len-i
가 될 때까지 별 출력을 반복한다. 반복조건을 len-i
로 작성한 이유는 바깥쪽 반복문의 iterator i
가 하나씩 증가할 때마다 별이 하나씩 줄어야 하기 때문이다.
4) 오른쪽, 하단에서 상단으로
1 | import java.util.Scanner; |
이번엔 반대로 3)의 별 트리를 오른쪽으로 밀어붙인 형태이다. 왼쪽이 빈 칸, 오른쪽이 별인 형태이다.
안쪽 첫번째 반복문은 빈 칸을 작성하는 반복문이고, 안쪽 두번째 반복문은 별을 작성하는 반복문이다.
안쪽 첫 번째 반복문부터 보면, 왼쪽이 빈 칸이므로 빈 칸을 작성하는 반복문을 작성하였다. 0에서 시작해서 바깥쪽 iterator i
가 될 때까지 1씩 증가하는 조건으로 작성하였다.
안쪽 두 번째 반복문은 빈 칸에 이어 별이 입력되는 반복문인데, 0에서 반복조건을 k<len-i
로 작성하였다. 별 트리의 넓이를 사용자로부터 입력받은 len 에 맞추고, 줄이 바뀔 때마다 별의 갯수가 하나씩 줄어들기 때문이다.