플로이드의 삼각형
이번 과제에서도 파라미터로 정수형 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
추가 힌트
파라미터 height에 따라, 가장 큰 수(마지막 수)를 구하는 공식은 height * (height + 1) / 2입니다.
해당 공식으로부터 얻은 결과값을 문자열로 변환시키고, 그 문자열의 길이를 파악하면 최댓값의 길이를 알 수 있습니다.
정수형을 문자열로 변환하기 위해서는 String.valueOf(숫자)처럼 메소드를 사용합니다. 또한 문자열의 길이를 파악하기 위해서는 문자열.length()처럼 메소드를 씁니다. 따라서 아래와 같이 정리할 수 있습니다.
// 숫자 자리 구하기
int length = String.valueOf(height * (height + 1) / 2).length();
파라미터와 출력값의 관계를 살펴봅시다.
첫째, 파라미터는 높이 height를 의미합니다. 높이가 3이면 3줄에 걸쳐서 삼각형이 출력되고, 높이가 5이면 5줄에 걸쳐서 삼각형이 출력됩니다.
둘째, 첫 번째 줄에서는 숫자 1개, 두 번째 줄에서는 2개, 세 번째 줄에서는 3개, n번째 줄에서는 n개가 출력됩니다.
따라서 높이가 height라면, 총 (1 + 2 + 3 + 4 + ... + height)개의 수가 출력되는 것이지요. 가장 큰 수는 문제의 힌트에 나와있는대로 height * (height + 1) / 2가 됩니다.
셋째, 패딩 부분입니다. 파라미터에 따라 가장 큰 수가 정해지고, 이로부터 가장 큰 수의 자릿수(문자열로 변환했을 때의 길이: 힌트 1)를 알 수 있습니다. 가장 큰 수의 자릿수와 현재 출력하려는 수의 자릿수의 차이만큼 더 패딩을 주어 띄어써주면 됩니다.
public class ShapePrinter {
public void printFloydsPyramid(int height) {
// 숫자 자리 구하기
int length = String.valueOf(height * (height + 1) / 2).length();
// 인쇄될 수
int number = 1;
// 반복문 1 - 행을 바꾸는 반복문
for (int row = 1; row <= height; row++) {
// 각 줄을 출력: 각 줄의 숫자, 패딩, 공백에 유의해야 함.
// 한 행마다 인쇄될 내용을 담는 문자열을 선언해준 후, 아래의 내용을 더해주면 좋음.
String line = "";
// 반복문 안에 반복문을 중첩하여 사용하여, 아래의 사항을 구현해보세요!
// 숫자: 1부터 시작하여, 각 줄의 row만큼의 수를 오름차순 순서대로 출력해주기
// 패딩: 가장 큰 수의 자릿수와 현재 출력하고자 하는 수의 자릿수의 차이만큼 패딩주기
// 공백: 실제 인쇄될 수를 문자열에 더하고, 한 칸 띄워주기
// 출력
System.out.println(line);
}
}
}
작성 코드
'TIL > Java' 카테고리의 다른 글
[Java] 중간고사: 문제 해결 능력 기르기_코드잇 소개 프로그램 (0) | 2022.01.07 |
---|---|
[Java] 콘솔 입력 받기(Scanner) (0) | 2022.01.07 |
[Java] 중간고사: 문제 해결 능력 기르기_피라미드 그리기 (0) | 2022.01.05 |
[Java] 중간고사: 문제 해결 능력 기르기_삼각형 그리기 (0) | 2022.01.05 |
[Java] 중간고사: 문제 해결 능력 기르기_평균값 계산기 (0) | 2022.01.05 |