problem

#1022 돈 심은데 돈난다

라비다 문제 링크

테스트케이스 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");
		}
	}
}