๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“–CS/๐Ÿ“™Data Structure

[์ž๋ฃŒ๊ตฌ์กฐ] Chapter2. Arrays and Structures(2)

by goguma.dev 2024. 10. 5.

โ€ป ์ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€๋“ค์€ knu EK.Ryu ๊ต์ˆ˜๋‹˜์˜ <์ž๋ฃŒ๊ตฌ์กฐ> ์ˆ˜์—…์„ ๋“ฃ๊ณ  ๋‚˜๋ฆ„๋Œ€๋กœ ํ•„์ž๊ฐ€ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

โ€ป ๋ถ€์กฑํ•œ ์„ค๋ช…์ด ์žˆ๊ฑฐ๋‚˜, ์ž˜๋ชป ์•Œ๊ณ  ์ž‘์„ฑํ•œ ๋ถ€๋ถ„์ด ๋ณด์ธ๋‹ค๋ฉด ํŽธํ•˜๊ฒŒ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ˜Š

2.4 Polynomials

์ด ํŒŒํŠธ์—์„œ๋Š” ๋‹คํ•ญ์‹์˜ ๋ง์…ˆ์„ ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์—ฐ์Šตํ•ด ๋ด…์‹œ๋‹ค!

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋‘ ๊ฐœ์˜ ๋‹คํ•ญ์‹์ด ์ฃผ์–ด์ง€๋ฉด ๋”ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

(1) #define๊ณผ #include ๋ถ€๋ถ„

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 100
#define COMPARE(x, y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1)

 

  • #define MAX_TERMS 100: ๋‹คํ•ญ์‹์—์„œ ์‚ฌ์šฉํ•  ์ตœ๋Œ€ ํ•ญ์˜ ๊ฐœ์ˆ˜๋ฅผ 100์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • #define COMPARE(x, y): ๋‘ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ž‘์œผ๋ฉด -1, ๊ฐ™์œผ๋ฉด 0, ํฌ๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.

 

(2) polynomial ๊ตฌ์กฐ์ฒด ์ •์˜, terms ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด๊ณผ avail ๋ณ€์ˆ˜

typedef struct {
    float coef; // ๊ณ„์ˆ˜ (๋‹คํ•ญ์‹ ํ•ญ์˜ ์ˆซ์ž ๋ถ€๋ถ„)
    int expon;  // ์ง€์ˆ˜ (๋‹คํ•ญ์‹ ํ•ญ์˜ x์˜ ์ง€์ˆ˜ ๋ถ€๋ถ„)
} polynomial;

polynomial terms[MAX_TERMS];
int avail = 0;

 

 

  • terms: ๋‹คํ•ญ์‹ ํ•ญ์„ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ์ฒด polynomial ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” MAX_TERMS๋กœ ์ •์˜๋œ 100์ž…๋‹ˆ๋‹ค.
  • avail: ํ˜„์žฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ•ญ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ด ๋ณ€์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

(3) attach ํ•จ์ˆ˜

void attach(float coefficient, int exponent) {
    if (avail >= MAX_TERMS) {
        fprintf(stderr, "Too many terms in the polynomial\n");
        exit(1);
    }
    terms[avail].coef = coefficient;
    terms[avail++].expon = exponent;
}

 

 

  • ์ƒˆ๋กœ์šด ํ•ญ์„ ๋‹คํ•ญ์‹ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ๋ฐฐ์—ด์— ๋” ์ด์ƒ ํ•ญ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  • terms[avail]์— ํ•ญ์„ ์ถ”๊ฐ€ํ•˜๊ณ  avail์„ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

 

(4) padd ํ•จ์ˆ˜ (๋‹คํ•ญ์‹ ๋ง์…ˆ โœจ)

void padd(int startA, int finishA, int startB, int finishB, int* startD, int* finishD) {
    float coefficient;
    *startD = avail;
    while (startA <= finishA && startB <= finishB) {
        switch (COMPARE(terms[startA].expon, terms[startB].expon)) {
        case -1:
            attach(terms[startB].coef, terms[startB].expon);
            startB++;
            break;
        case 0:
            coefficient = terms[startA].coef + terms[startB].coef;
            if (coefficient)
                attach(coefficient, terms[startA].expon);
            startA++;
            startB++;
            break;
        case 1:
            attach(terms[startA].coef, terms[startA].expon);
            startA++;
        }
    }
    for (; startA <= finishA; startA++)
        attach(terms[startA].coef, terms[startA].expon);
    for (; startB <= finishB; startB++)
        attach(terms[startB].coef, terms[startB].expon);
    *finishD = avail - 1;
}

 

 

 

  • ์ฒซ ๋ฒˆ์งธ ๋‹คํ•ญ์‹์˜ ์‹œ์ž‘๊ณผ ๋์„ startA, finishA๋กœ, ๋‘ ๋ฒˆ์งธ ๋‹คํ•ญ์‹์˜ ์‹œ์ž‘๊ณผ ๋์„ startB, finishB๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ๋‘ ๋‹คํ•ญ์‹์„ ๋ฏ๋‚˜ ๊ฒฐ๊ณผ ๋‹คํ•ญ์‹์˜ ์‹œ์ž‘๊ณผ ๋ ์ธ๋ฑ์Šค๋ฅผ *startD์™€ *finishD์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๋ณ€์ˆ˜์— ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • COMPARE ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ํ•ญ์˜ ์ง€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๊ณ , ํ•œ ๋‹คํ•ญ์‹์ด ๋จผ์ € ๋๋‚˜๋ฉด ๋‚˜๋จธ์ง€ ๋‹คํ•ญ์‹์˜ ํ•ญ๋“ค์„ ๊ทธ๋Œ€๋กœ ๊ฒฐ๊ณผ ๋‹คํ•ญ์‹์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

(5) print_polynomial ํ•จ์ˆ˜

void print_polynomial(int start, int finish) {
    for (int i = start; i <= finish; i++) {
        if (i > start && terms[i].coef > 0) printf("+ ");
        printf("%fx^%d ", terms[i].coef, terms[i].expon);
    }
    printf("\n");
}

 

  • ๋‹คํ•ญ์‹์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • start๋ถ€ํ„ฐ finish๊นŒ์ง€์˜ ํ•ญ์„ ์ถœ๋ ฅํ•˜๋ฉฐ, ์–‘์ˆ˜์ธ ํ•ญ ์•ž์—๋Š” +๋ฅผ ๋ถ™์—ฌ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

(6) main ํ•จ์ˆ˜

int main() {
    attach(4, 3);
    attach(3, 2);
    attach(5, 0);

    attach(3, 3);
    attach(1, 2);
    attach(2, 1);

    int startD, finishD;
    padd(0, 2, 3, 5, &startD, &finishD);

    print_polynomial(startD, finishD);

    return 0;
}

 

  • ์ฒซ ๋ฒˆ์งธ ๋‹คํ•ญ์‹ (4x³ + 3x² + 5)์™€ ๋‘ ๋ฒˆ์งธ ๋‹คํ•ญ์‹ (3x³ + 1x² + 2x)์„ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋‹คํ•ญ์‹์„ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ padd ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

 

2.5 Sparse matrices

Sparse matrix๋Š” ๋งŽ์€ ์›์†Œ๊ฐ€ 0์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ–‰๋ ฌ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ํ–‰๋ ฌ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์›์†Œ๊ฐ€ 0์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ์›์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ณ„์‚ฐ ํšจ์œจ ์ธก๋ฉด์—์„œ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, sparse matrix๋Š” 0์ด ์•„๋‹Œ ์›์†Œ๋งŒ์„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” 0์ด ์•„๋‹Œ ์›์†Œ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํ–‰๊ณผ ์—ด, ๊ฐ’์„ ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

#define MAX-TERMS 101 /* maximum number of terms +1*/
typedef struct {
	int col;
	int row;
	int value;
} term;
term a[MAX-TERMS];

 

 

 

(1) ์ „์น˜ ํ–‰๋ ฌ ๋ฐฉ๋ฒ•1 (๋น„ํšจ์œจ์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„)

#define CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_TERMS 101
typedef struct {
	int col;
	int row;
	int value;
} term;

term a[MAX_TERMS];
term b[MAX_TERMS];

void transpose(term a[], term b[])
{
	int n, i, j, currentb;
	n = a[0].value;
	b[0].row = a[0].col;
	b[0].col = a[0].row;
	b[0].value = n;

	if (n > 0)
	{
		currentb = 1;
		for (i = 0; i < a[0].col; i++)
			for (j = 1; j <= n; j++)
				if (a[j].col == i)
				{
					b[currentb].row = a[j].col;
					b[currentb].col = a[j].row;
					b[currentb].value = a[j].value;
					currentb++;
				}
	}
}

void printMatrix(term a[])
{
	int n, i;
	n = a[0].value;
	printf("row col value\n");
	for (i = 0; i <= n; i++)
		printf("%d %d %d\n", a[i].row, a[i].col, a[i].value);
}

int main()
{
	a[0].row = 6;
	a[0].col = 6;
	a[0].value = 8;
	a[1].row = 0;
	a[1].col = 0;
	a[1].value = 15;
	a[2].row = 0;
	a[2].col = 3;
	a[2].value = 22;
	a[3].row = 0;
	a[3].col = 5;
	a[3].value = -15;
	a[4].row = 1;
	a[4].col = 1;
	a[4].value = 11;
	a[5].row = 1;
	a[5].col = 2;
	a[5].value = 3;
	a[6].row = 2;
	a[6].col = 3;
	a[6].value = -6;
	a[7].row = 4;
	a[7].col = 0;
	a[7].value = 91;
	printf("Matrix A\n");
	printMatrix(a);
	transpose(a, b);
	printf("Matrix B\n");
	printMatrix(b);
	return 0;
}

 

  • ์ด ์ฝ”๋“œ์—์„œ transpose() ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ์›๋ณธ ํ–‰๋ ฌ์˜ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ๋Š” ์›๋ณธ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ๊ฐ’๋“ค(๋น„ - 0์ธ ์›์†Œ)์— ๋Œ€ํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n*m) ์ž…๋‹ˆ๋‹ค.
  • ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ์š”?

 

(2) ์ „์น˜ ํ–‰๋ ฌ ๋ฐฉ๋ฒ•2 (ํšจ์œจ์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„)

void fasttranspose(term a[], term b[])
{
	int row_terms[MAX_TERMS], starting_pos[MAX_TERMS];
	int i, j, num_cols = a[0].col, num_terms = a[0].value;
	b[0].row = num_cols;
	b[0].col = a[0].row;
	b[0].value = num_terms;
	if (num_terms > 0)
	{
		for (i = 0; i < num_cols; i++)
			row_terms[i] = 0;
		for (i = 1; i <= num_terms; i++)
			row_terms[a[i].col]++;
		starting_pos[0] = 1;
		for (i = 1; i < num_cols; i++)
			starting_pos[i] = starting_pos[i - 1] + row_terms[i - 1];
		for (i = 1; i <= num_terms; i++)
		{
			j = starting_pos[a[i].col]++;
			b[j].row = a[i].col;
			b[j].col = a[i].row;
			b[j].value = a[i].value;
		}
	}
}
  • ๋จผ์ €, 1์ฐจ์› ๋ฐฐ์—ด ๋‘ ๊ฐœ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. (row_terms, starting_pos)
  • row_terms๋Š” i ์—ด์— ๋ช‡ ๊ฐœ์˜ ๊ฐ’์ด ์žˆ๋Š”์ง€๋ฅผ ์ €์žฅํ•˜๊ณ , starting_pos๋Š” ๊ฐ i์—ด์ด ์ „์น˜๋œ ํ–‰๋ ฌ์—์„œ ๋ช‡ ๋ฒˆ์งธ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜๋Š”์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฐ์—ด์„ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋จผ์ € ์ƒ์„ฑํ•จ์œผ๋กœ์จ, ์ „์น˜๋œ ํ–‰๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ํ•˜๋‚˜์˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(numCol + numTerms)์œผ๋กœ, ์ด์ „ ์ฝ”๋“œ๋ณด๋‹ค ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

 

2.6 Representation of Multidimensional Arrays

๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์†Œ ์œ„์น˜๋ฅผ a๋ผ๊ณ  ํ•˜๋ฉด, ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŠน์ • ์š”์†Œ๊นŒ์ง€ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.