아는개발자 2021. 11. 23. 22:57

Q.8. 요소의 삽입 과정을 자세하게 출력할 수 있도록 단순 삽입 정렬 프로그램을 수정하세요. 오른쪽처럼 현재 선택한 요소 아래에 기호 +, 삽입하는 위치의 요소 아래에 기호 ^, 그 사이에 기호 -를 출력하세요. 삽입하지 않는(요소의 이동이 필요없는) 경우에는 선택한 요소 아래에 +만 출력하면 됩니다.

내 답변:

void insertion(int a[], int n) {
	int j;
	for (int i = 1; i < n; i++) {
		int exg = 0;

		for (int k = 0; k < n; k++)
			printf("%3d", a[k]);
		putchar('\n');

		int tmp = a[i];
		for (j = i; j > 0 && a[j - 1] > tmp; j--) {
			a[j] = a[j - 1];
			exg++;
		}
		a[j] = tmp;

		if (exg == 0) {
			for (int k = 0; k < n; k++)
				printf("%3c", k == i ? '+' : ' ');
		}
		else {
			for (int k = 0; k < j; k++)
				printf("   ");
			for (int k = j; k < i; k++)
				printf("%3s", k == j ? "^--" : "---");
			printf("--+");
		}
		putchar('\n');
	}
	for (int k = 0; k < n; k++)
		printf("%3d", a[k]);
	putchar('\n');
}

정답:

printf("%*s%s", 4 * j, "", (i != j) ? "^-" : "  ");

이 부분의 %*s 는 처음 봤다. 그래서 찾아보니 아래와 같은 설명이 나왔다.

https://fmyson.tistory.com/164

확실히 이렇게 하니 공백도 넣을 수 있고 좋다... 나는 공백을 넣으려고 exg 라는 변수도 선언했는데 메모리도 아낄 수 있고 코드도 깔끔해 보인다. 이건 나중에 한 번 더 복습해서 내 걸로 만들어야겠다.

/*--- 단순 삽입 정렬(삽입 과정 출력) ---*/
void insertion(int a[], int n)
{
	int i, j, m;

	for (i = 1; i < n; i++) {
		int tmp = a[i];

		for (m = 0; m < n; m++)
			printf("%3d ", a[m]);
		putchar('\n');

		for (j = i; j > 0 && a[j - 1] > tmp; j--)
			a[j] = a[j - 1];
		a[j] = tmp;

		printf("%*s%s", 4 * j, "", (i != j) ? "^-" : "  ");
		for (m = 0; m < 4 * (i - j); m++)
			putchar('-');
		printf("+\n\n");
	}
	for (m = 0; m < n; m++)
		printf("%3d ", a[m]);
	putchar('\n');
}