테스트케이스 t의 값이 첫번째 줄에 입력된다. 두번째 줄에 n의 값이 입력된다.
아래는 PPT에서 설명한 풀이 코드이다.
#include <stdio.h>
int main() {
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
// b는 blank의 수, diff_b는 blank가 줄어드는 값, m은 출력되는 숫자의 수
int b = n - 1, diff_b = 1, m = 1;
//i가 1만큼 증가한다는 뜻은 한줄을 출력하고 그 다음줄을 들어간다는 의미
//이 때 blank의 개수는 감소하다가 n번째 줄 이후로 늘어난다
//m의 값은 2개씩 늘어나다가 n번째 줄 이후로 2개씩 감소한다
for (int i = 1; i <= 2 * n - 1; i++, b -= diff_b, m += 2 * diff_b) {
//diff_n은 늘어나는 num의 값, num은 출력되는 숫자를 의미
int diff_n = 1, num = 1;
//black의 개수만큼 black출력
for (int j = 1; j <= b; j++) {
printf(" ");
}
//그 다음 칸부터 숫자를 출력하다가 n번째 칸 이후로 1씩 감소
for (int j = b+1; j <= b + m; j++) {
//n번째 칸에 도달했을 때 줄어들어야 하므로 diff_n을 -1로 바꿔준다
if (j == n) {
diff_n *= -1;
}
//num값을 출력해준다
printf("%d", num);
//n보다 j가 작거나 같을 때는 num값이 증가하다가 n보다 클 때는 감소한다
//이 때 diff_n값이 1에서 -1로 바뀌는 것!!
num += diff_n;
}
//blank의 개수가 감소하다가 n번째 줄 이후로 증가한다
//이 때 diff_b의 값을 -1로 바꿔주면서 b-=diff_b에서 1씩 증가하게된다.
if (i == n) {
diff_b *= -1;
}
printf("\n");
}
}
}
이 코드는 수업시간에 설명만 했던 코드로 출력을 4개로 분할해서 생각한다.
이 때 나눠지는 기준을 마름모를 기준으로 가로, 세로로 가운데를 기준으로 4개로 나눠서 생각한다.
#include <stdio.h>
int main() {
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
//위쪽 삼각형 1부터 123 ... n ... 321까지
for (int i = 0; i < n - 1; i++) {
//공백을 출력하는 반복문 처음에 n-1개, n-2개, ..., 1개
for (int j = 0; j < n - i - 1; j++) {
printf(" ");
}
// 숫자를 출력하는 반복문 증가하는 숫자 출력
for (int j = 0; j < i+1; j++) {
printf("%d", j+1);
}
// 숫자를 출력하는 반복문 감소하는 숫자 출력
for (int j = 0; j < i; j++) {
printf("%d", i - j);
}
printf("\n");
}
//아래쪽 역삼각형을 출력하는 반복문 123 ... n-1 ... 321부터 1까지
for (int i = 0; i < n; i++) {
//공백을 출력하는 반복문 0부터 1개씩 증가
for (int j = 0; j < i; j++) {
printf(" ");
}
//숫자를 출력하는 반복문 증가하는 숫자 출력
for (int j = 0; j < n - i; j++) {
printf("%d", j + 1);
}
//숫자를 출력하는 반복문 감소하는 숫자 출력
for (int j = 0; j < n - i - 1; j++) {
printf("%d", n - j - i - 1);
}
printf("\n");
}
}
}