๋ฐ˜๊ฐ€์›Œ์š”! ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค!

์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜„๋Œ€ ์—ฐ๊ธˆ์ˆ ์‚ฌ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋Š๋‚€ ์ ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ

[C์–ธ์–ด] ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ๋ฆฌ์ŠคํŠธ

mmin.h 2020. 11. 6. 10:48

๋ฆฌ์ŠคํŠธ์˜ ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž… 
๋ฆฌ์ŠคํŠธ๋Š” ์ž๋ฃŒ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 
์ผ์ƒ์ƒํ™œ์—์„œ ํ• ์ผ... ๋ฒ„ํ‚ท๋ฆฌ์ŠคํŠธ.. ์š”์ผ.... ๋“ฑ๋“ฑ 
๋‹ค์–‘ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

๋ฆฌ์ŠคํŠธ์—๋Š” ํ•ญ๋ชฉ๋“ค์ด ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ํ•ญ๋ชฉ๋“ค์€ ์šด์„œ ๋˜๋Š” ์œ„์น˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. 

L = (item0,item1,item2,....,itemn-1)

 

๋ฆฌ์ŠคํŠธ ADT 
๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์–ด๋–ค ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? 
- ๋ฆฌ์ŠคํŠธ์— ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ ์ถ”๊ฐ€ (์‚ฝ์ž…, ์—ฐ์‚ฐ)
- ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ ์‚ญ์ œ (์‚ญ์ œ ์—ฐ์‚ฐ)

- ๋ฆฌ์ŠคํŠธ ํŠน์ • ํ•ญ๋ชฉ ๊ฒ€์ƒ‰(ํƒ์ƒ‰ ์—ฐ์‚ฐ)

 

์ด๋ฅผ ์ถ”์ƒ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ช‡๊ฐœ๋งŒ ์ •์˜ ํ•ด๋ณด๋ฉด 

- ๊ฐ์ฒด : n๊ฐœ์˜ elementํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ˆœ์„œ ์žˆ๋Š” ๋ชจ์ž„ 

- ์—ฐ์‚ฐ: 
insert(list,pos,item)::= pos ์œ„์น˜์— ์š”์†Œ ์ถ”๊ฐ€ 
delete(list,pos) ::= pos ์œ„์น˜์— ์š”์†Œ ์ œ๊ฑฐ 
get_entry(list, pos) ::= pos ์œ„์น˜์˜ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜

 

์ด์™ธ์— ๊ธธ์ด๋ฅผ ๊ตฌํ•œ๋‹ค๋˜๊ฐ€, ๊ฝ‰์ฐผ๋‹ค๋˜๊ฐ€, ๋น„์—ฌ์žˆ๋‹ค๋˜๊ฐ€, ์ถœ๋ ฅํ•œ๋‹ค๋˜๊ฐ€, ์ค‘๊ฐ„์— ์‚ฝ์ž…ํ•œ๋‹ค๋˜๊ฐ€ ๋“ฑ๋“ฑ 
๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„

๊ทธ๋Ÿผ ์•ž์„œ ๋งŒ๋“  ADT ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ด…์‹œ๋‹ค. ์ด๋ฒˆ๊ธ€์—์„  ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐฐ์—ด๊ณผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. 

๋ฐฐ์—ด์„ ์ด์šฉํ•˜๋ฉด ADT ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฅ์  : ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ๋น ๋ฅด๋‹ค.
๋‹จ์  : ๋ฐฐ์—ด์˜ ํŠน์„ฑ์ƒ ๋™์ ์œผ๋กœ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ -> CPU ์‹œ๊ฐ„ ๋‚ญ๋น„ ์ดˆ๋ž˜

๋˜ํ•œ ์ค‘๊ฐ„์— ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฝ์ž… ๋˜๋Š” ์‚ญ์ œ๋ฅผ ํ•˜๋ฉด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ๋‘ ์ด๋™์‹œ์ผœ์•ผํ•จ. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ? 
์žฅ์ : ์ค‘๊ฐ„์— ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„
๋‹จ์  : ๊ตฌํ˜„์ด ๋ณต์žกํ•˜๊ณ , ์ž„์˜์˜ ํ•ญ๋ชฉ์„ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆผ

 

๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ์ƒ๊ฐํ•˜๊ณ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์„ค๊ณ„๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์งœ๋ฉด ๋ ๊ฒ๋‹ˆ๋‹ค. 

 

๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

#include <stdio.h>
#define MAX_LIST_SIZE 100 		// ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ€ํฌ๊ธฐ

typedef int element; 			// ํ•ญ๋ชฉ์˜ ์ •์˜
typedef struct {
	element array[MAX_LIST_SIZE]; 	// ๋ฐฐ์—ด ์ •์˜
	int size; 						// ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ํ•ญ๋ชฉ๋“ค์˜ ๊ฐœ์ˆ˜
} ArrayListType;

// ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜
void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}
// ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜
void init(ArrayListType* L)
{
	L->size = 0;
}
// ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด 1์„ ๋ฐ˜ํ™˜
// ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜
int is_empty(ArrayListType* L)
{
	return L->size == 0;
}
// ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ€๋“ ์ฐจ ์žˆ์œผ๋ฉด 1์„ ๋ฐ˜ํ™˜
// ๊ทธ๋ ‡์ง€ ๋งŽ์œผ๋ฉด 1์„ ๋ฐ˜ํ™˜
int is_full(ArrayListType* L)
{
	return L->size == MAX_LIST_SIZE;
}
//
element get_entry(ArrayListType* L, int pos)
{
	if (pos < 0 || pos >= L->size)
		error("์œ„์น˜ ์˜ค๋ฅ˜");
	return L->array[pos];
}
// ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
void print_list(ArrayListType* L)
{
	int i;
	for (i = 0; i < L->size; i++)
		printf("%d->", L->array[i]);
	printf("\n");
}
//
void insert_last(ArrayListType* L, element item)
{
	if (L->size >= MAX_LIST_SIZE) { //full์„ ํ˜ธ์ถœ ํ•ด์ค˜๋„ ๋œ๋‹ค. 
		error("๋ฆฌ์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ");
	}
	L->array[L->size++] = item; //์ฆ๊ฐ€ ์‹œํ‚ค๋Š” ์˜คํผ๋ ˆ์ด์…˜์ด ์ค‘์š”! 
	//๋Œ€์ž…ํ•˜๋Š” ์—ฐ์‚ฐ์ด ์šฐ์„  -> ๊ทธ ๋‹ค์Œ size๋ฅผ ๋Š˜๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 
}
//
void insert(ArrayListType* L, int pos, element item) //์ค‘์š”!! 
{
	if (!is_full(L) && (pos >= 0) && (pos <= L->size)) { 
		// pos <= L->size ๋ผ๊ณ  ํ•˜๋Š” ์ด์œ ๋Š” ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๊ณ ๋ คํ•˜์—ฌ =์„ ๋„ฃ์—ˆ๋‹ค.
		for (int i = (L->size - 1); i >= pos; i--) //shift ํ•˜๋Š” ๊ณผ์ • //for์˜ ์กฐ๊ฑด์„ ์ œ๋Œ€๋กœ ์“ฐ๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค! 
			//shift ์—ฐ์‚ฐ์„ ํ• ๋–„๋Š” i ๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋’ค์— ์žˆ๋Š”์• ํ•œํ…Œ ์—Ž์–ด์“ฐ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์ค˜์•ผ์ง€ ์ œ๋Œ€๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค. 
			L->array[i + 1] = L->array[i]; 
		L->array[pos] = item;
		L->size++;
	}
}
//
element delete(ArrayListType* L, int pos)
{
	element item;
	//insert 0<= pos <= L->size 3๊ฐœ 0,1,2...(3)์„ ๋„ฃ๋Š” ๊ฒƒ์ด ๋ง์ด ๋œ๋‹ค. 
	//delete 0,1,2,...() ์—ฌ๊ธฐ์„œ 3์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ์œ„์น˜๋ผ์„œ ๊ฑธ๋Ÿฌ์ค€๋‹ค. 
	//insert์™€ delete์— ๋”ฐ๋ผ ์œ ํšจํ•œ ์œ„์น˜๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๋‹ค.! 
	if (pos < 0 || pos >= L->size)  
		error("์œ„์น˜ ์˜ค๋ฅ˜");
	item = L->array[pos]; 
	for (int i = pos; i < (L->size - 1); i++) //์ด๋ฒˆ์—” ์•ž์— ์•„์ด๋ถ€ํ„ฐ ๋•ก๊ธด๋‹ค. ๋’ค์—์„œ๋ถ€ํ„ฐ ๋•ก๊ธฐ๋ฉด ๋˜ ์—Ž์–ด์“ฐ๊ฒŒ ๋œ๋‹ค.
		//size ๊ฐ€ 4๋‹ˆ๊น size-1๊นŒ์ง€ for ๋ฌธ์ด ๋Œ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. <=๋ฅผ ์•ˆํ•˜๊ณ  <๋งŒ ํ•œ๋‹ค.
		L->array[i] = L->array[i + 1]; //์ด ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ƒ์— ๋”ฐ๋ผ for ๋ฌธ ์•ˆ์˜ ์กฐ๊ฑด์ด ๋‹ฌ๋ผ์ง„๋‹ค. 
	L->size--;
	return item;
}
void insert_first(ArrayListType* L, element item) {
	if (!is_full(L)) {
		//pos 0 index ๊ฐ’์„ ์ €์žฅํ•  ๊ณ„ํš 
		// 0, 1, ...,size-1 -> 1,2,...,size

		for (int i = L->size - 1; i >= 0; i--) {
			L->array[i + 1] = L->array[i];
		}
		L->array[0] = item;
		L->size++;
	}
}

//
int main(void)
{
	// ArrayListType๋ฅผ ์ •์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ArrayListType๋ฅผ 	
	// ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.
	ArrayListType list;

	init(&list); //size = 0
	insert_first(&list, 10);	print_list(&list);
	insert(&list, 0, 10);		print_list(&list);	// 0๋ฒˆ์งธ ์œ„์น˜์— 10 ์ถ”๊ฐ€
	insert(&list, 0, 20);		print_list(&list);	// 0๋ฒˆ์งธ ์œ„์น˜์— 20 ์ถ”๊ฐ€
	insert(&list, 0, 30);		print_list(&list);	// 0๋ฒˆ์งธ ์œ„์น˜์— 30 ์ถ”๊ฐ€
	insert_last(&list, 40);		print_list(&list);	// ๋งจ ๋์— 40 ์ถ”๊ฐ€
	delete(&list, 0);			print_list(&list);	// 0๋ฒˆ์งธ ํ•ญ๋ชฉ ์‚ญ์ œ

	return 0;
}


์‹คํ–‰์‹œ๊ฐ„ ๋ถ„์„ 

๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” get๊ณผ ๊ฐ™์€ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ์—ฐ์‚ฐ์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•˜๋‹ˆ O(1)์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ๋“ค์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” O(n)์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.