문제
이번 과제에서도 파라미터로 정수형 height를 받고, 높이가 height인 '직각 이등변 삼각형'을 출력할텐데요.
이번에는 * 대신 숫자가 순서대로 출력되는 플로이드의 삼각형 입니다!
패딩 (Padding)
height가 5인 경우 가장 큰 값인 15는 두 자리 수입니다.
그러면 한 자리 수 값들을 출력할 때 앞에 띄어쓰기(" ")를 한 칸씩 해줘야 합니다.
이렇게 나오면 안 되고:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
이렇게 나와야 함:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
마찬가지로 height가 15인 경우 가장 큰 값인 120은 세 자리 수입니다.
따라서 한 자리 수 값들 앞에는 띄어쓰기 두 칸을 해줘야 하고,
두 자리 수 값들 앞에는 띄어쓰기 한 칸을 해줘야 합니다.
이렇게 나오면 안 되고:
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 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66
67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
이렇게 나와야 함:
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 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66
67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
힌트
앞에 패딩을 넣는 게 이 과제의 가장 어려운 부분일 수 있습니다. 패딩을 넣기 위해서 먼저 알아야할 것은 가장 큰 값입니다. 가장 큰 값은 1부터 height까지의 합인데, 이를 구하기 위해서는 이 공식을 따르면 됩니다:
height * (height + 1) / 2
예를 들어서 height가 5인 경우에 5 * (1 + 5) / 2는 15가 나오죠?
결과값을 문자열로 변환시키고, length 속성을 보면 최대값의 길이를 알 수 있습니다.
1
2 3
4 5 6
----------
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
----------
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 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66
67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
풀이 및 답
ShapePrinter 클래스
public class ShapePrinter {
public void printFloydsPyramid(int height) {
// 반복문 안에 반복문을 중첩하여 사용하여, 아래의 사항을 구현해보세요!
// 각 줄을 출력: 각 줄의 숫자, 패딩, 공백에 유의해야 함.
// 숫자: 1부터 시작하여, 각 줄의 row만큼의 수를 오름차순 순서대로 출력해주기
// 패딩: 가장 큰 수의 자릿수와 현재 출력하고자 하는 수의 자릿수의 차이만큼 패딩주기
// 공백: 실제 인쇄될 수를 문자열에 더하고, 한 칸 띄워주기
// 숫자 자리 구하기 (5)
int length = String.valueOf(height * (height + 1) / 2).length();
// 인쇄될 수 (6)
int number = 1;
// 반복문 1 - 행을 바꾸는 반복문(1)
for (int row = 1; row <= height; row++) {
// 한 행마다 인쇄될 내용을 담는 문자열을 선언 (3)
String line = "";
// 반복문 2 - 한 행에서 열을 바꾸는 반복문 (2)
for(int col = 1; col <= row; col++) {
// 반복문 3 - 한 열 안에서 자리수를 맞추는 반복문 (7)
for(int i = String.valueOf(number).length(); i < length; i++) {
line += " "; // 공백 넣어주기
}
// 실제 인쇄된 수를 문자열에 더하고 한 칸 띄워주기 (8)
line += (number + " "); // 형변환에 의해 문자열 + 문자열
number++;
}
// 출력! (4)
System.out.println(line);
}
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
ShapePrinter printer = new ShapePrinter();
// 테스트
printer.printFloydsPyramid(3);
System.out.println("----------");
printer.printFloydsPyramid(5);
System.out.println("----------");
printer.printFloydsPyramid(15);
}
}