공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
for문을 활용해서 여러 가지 모양을 출력하기
다중 for 문을 활용한다면 여러 가지 모양을 출력할 수 있다. 출력할 모양이 어떤 규칙을 갖고 있는지 파악하는 게 가장 중요하다.
1. 정사각형
위의 그림에서 회색 부분에 * 이 출력된다고 생각하면 된다. 정사각형은 가로와 세로의 길이가 같은 사각형을 의미하므로 행( i )과 열( j )의 크기를 같게 해주면 되고, 직각 사각형은 행( i )과 열( j )의 크기가 다르므로 원하는 값으로 설정해 주면 된다. 첫 번째 for 문에 나오는 i 가 행렬의 행과 같고 두번 째 for 문의 j 가 행렬의 열과 같다고 생각하면 된다. 행( i )은 증가하면서 반복되지만 열( j )은 매 행마다 똑같은 크기만큼 반복되는 것을 확인할 수 있다.
package test;
class test{
public static void main(String[] args) {
for(int i = 0 ; i < 5 ; i++) { //5개의 줄 생성
for(int j = 0 ; j < 5 ; j++) { //줄마다 5번씩 반복실행
System.out.print("*");
}
System.out.println(); //줄바꿈
}
}
}
2 - 1. 직각삼각형(왼쪽)
print 문의 출력은 기본적으로 왼쪽 정렬되어서 출력된다. 그래서 왼쪽 직각삼각형 모양으로 출력하려면 * 을 하나씩 늘려서 출력하고 줄 바꿈 하면 된다. 행의 순서와 회색 부분의 개수가 똑같이 증가하므로 두 번째 for 문은 행( i )의 순서만큼 * 출력을 반복하면 된다.
package test;
class test{
public static void main(String[] args) {
for(int i = 1 ; i <= 5 ; i++) { //5개의 줄 생성
for(int j = 1 ; j <= i ; j++) { //행의 순서만큼(첫번째 줄이면 1, 두번째 줄이면 2...)반복
System.out.print("*");
}
System.out.println(); //줄바꿈
}
}
}
2 - 2. 직각삼각형(오른쪽)
오른쪽 직각 삼각형은 왼쪽 직각삼각형과는 조금 다르다. 위의 그림이 전체 공간이라고 하면 하얀 부분을 공백으로 출력하고 회색 부분을 * 로 출력해야 하는데 하얀 부분(공백)은 줄이 바뀔수록 감소하는 모양이고 회색 부분( * )은 줄이 바뀔수록 증가하는 추세이다. 눈여겨봐야 할 곳은 빨간색으로 칠해진 부분인데(저기도 * 로 출력해야 됨) 저기를 기점으로 공백과 * 이 전환된다는 점이다. 또한 오른쪽을 기준으로 했을 때 행의 순서와 일치한다는 것을 알 수 있다.
package test;
class test{
public static void main(String[] args) {
for(int i = 1 ; i <= 5 ; i++) { //5개의 줄 생성
for(int j = 5 ; j > 0 ; j--) { //5개의 줄이므로 5에서부터 줄어들며 반복수행 (5x5)
if(j > i) { //줄의 순서(ex n번째 줄)보다 큰 경우 -> 빨간색칸 기준 왼쪽칸인 경우
System.out.print(" "); //공백출력
}else { //줄의 순서보다 작거나 같은경우(== 빨간색 칸을 포함해서 오른쪽칸인 경우)
System.out.print("*"); //*출력
}
}
System.out.println(); //줄바꿈
}
}
}
j 를 감소시켜가면서 n 번째 줄 순서보다 큰 경우(빨간색 칸 기준 왼쪽의 칸들) 공백을 출력하고, n 번째 줄 순서보다 큰 경우(빨간색 칸을 포함해서 오른쪽의 칸) * 을 출력한다. 한 줄의 반복이 끝나면 줄 바꿈 한다.
3. 마름모
마름모는 어떻게 출력할까 고민하다가 양쪽이 대칭으로 출력된다는 것을 알았다. 빨간 줄을 기준으로 윗부분은 흰색 부분이 3 칸부터 1 칸씩 줄어들고 회색 부분은 1 칸부터 2 칸씩 증가한다. 그리고 빨간 줄 아랫부분은 흰색 부분이 0 칸부터 시작해서 1 칸씩 증가하고 회색 부분은 7 칸부터 시작해서 2 칸씩 줄어드는 모양이다.
그래서 for 문을 3 번돌려서 흰색 → 회색 → 흰색 순으로 출력해보면 어떨까 생각했다.
package test;
class test{
public static void main(String[] args) {
int a = 1 ; //회색칸("*")의 시작개수
int b = 3 ; //공백의 시작개수
for(int i = 0 ; i < 7 ; i++) { // 7개의 줄 생성
if(i < 3) { //빨간줄을 기준으로 윗부분일경우
for(int j = b ; j > 0 ; j--){ //b(흰부분, 공백)의 크기만큼 반복
System.out.print(" ");
}
for(int j = 0 ; j < a ; j++) { //a(회색부분, *)의 크기만큼 반복
System.out.print("*");
}
for(int j = b ; j > 0 ; j--){ //b(흰부분, 공백)의 크기만큼 반복
System.out.print(" ");
}
System.out.println(); //한줄의 출력이 끝나면 줄바꿈
a += 2; //a(회색부분, *)의 크기 2증가
b--; //b(흰부분, 공백)의 크기 1감소
}else { //빨간줄을 기준으로 아랫부분일 경우
for(int j = 0 ; j < b ; j++){ //b(흰부분, 공백)의 크기만큼 반복
System.out.print(" ");
}
for(int j = a ; j > 0 ; j--) { //a(회색부분, *)의 크기만큼 반복
System.out.print("*");
}
for(int j = 0 ; j < b ; j++){ //b(흰부분, 공백)의 크기만큼 반복
System.out.print(" ");
}
System.out.println(); //한줄의 출력이 끝나면 줄바꿈
a -= 2; //a(회색부분, *)의 크기 2감소
b++; //b(흰부분, 공백)의 크기 1증가
}
}
}
}
'Back end > Java 문제' 카테고리의 다른 글
[Java] 배열 정렬(sort) (0) | 2019.07.03 |
---|---|
[Java] 총합, 평균, 최대, 최소 (0) | 2019.06.26 |
[Java] Up&Down 게임 (0) | 2019.06.18 |
[Java] 문자열이 숫자인지 판별 (isDigit()) (0) | 2019.06.14 |
[Java] 구구단 (0) | 2019.06.13 |