Algorithms/Algorithms

[๋ฐ์ดํ„ฐ ๊ตฌ์กฐ] ๋ฐฐ์—ด(Array)์™€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Linked List)๋กœ ๋ฆฌ์ŠคํŠธ ์ถ”์ƒ์ž๋ฃŒํ˜• ๊ตฌํ˜„ (with C)

ํƒฑ์ ค 2021. 4. 16. 22:45

๋ฐฐ์—ด(Array)

  • ์ˆœ์ฐจ ๊ธฐ์–ต์žฅ์†Œ์— ํ• ๋‹น๋œ ์œ ํ•œ ๊ฐœ์ˆ˜์˜ ๋™์ผ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ ์›์†Œ๋“ค
  • ๋ฐฐ์—ด๋ช…, V: ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์ผ์ปซ๋Š” ๊ธฐํ˜ธ
  • ๋ฐฐ์—ด ํฌ๊ธฐ, N: ์›์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ์…€๋“ค์˜ ๊ฐœ์ˆ˜
  • ๋ฐฐ์—ด ์ฒจ์ž, i: ์…€์˜ ์ˆœ์œ„ = ์ƒ๋Œ€์  ์œ„์น˜

 

๋ฐฐ์—ด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

  • ์ปดํŒŒ์ผ ์‹œ ๋ฐฐ์—ด์˜ ์…€๋“ค์€ ๋ฒ ์ด์Šค(base)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฐฐ์—ด์˜ ์ฒซ์งธ ์…€ ์œ„์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ฐจ๋ก€๋กœ ํ• ๋‹น๋จ
  • ๊ฐ ์…€์€ ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์˜คํ”„์…‹(offset)๋งŒํผ ๋–จ์–ด์ง
  • ํ–‰ ์šฐ์„  ์ˆœ์„œ = ์ €์ฐจ์› ์šฐ์„  ์ˆœ์„œ

 

2์ฐจ์› ๋ฐฐ์—ด

  • ํ…Œ์ด๋ธ”์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ
  • 1์ฐจ์›๊ณผ 2์ฐจ์›์€ ๊ฐ๊ฐ ํ–‰, ์—ด๋กœ๋„ ๋ถˆ๋ฆผ

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list)

  • ๋™์  ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ, ๋งํฌ์— ์˜ํ•ด ์—ฐ๊ฒฐ๋œ ์œ ํ•œ ๊ฐœ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ์›์†Œ ๋…ธ๋“œ๋“ค
  • ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋ช…: L, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์‹œ์ž‘ ์œ„์น˜, ์ฒซ ๋…ธ๋“œ์˜ ์ฃผ์†Œ
  • ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ: n, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋‚ด ๋…ธ๋“œ์˜ ์ˆ˜
  • ์ข…๋ฅ˜ - ๋‹จ์ผ, ์ด์ค‘, ์›ํ˜•, ํ—ค๋” ๋ฐ ํŠธ๋ ˆ์ผ๋Ÿฌ, ๋ณตํ•ฉ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ
  • List, Stack, Queue(๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋“ค)๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(์žฌ๋ฃŒ)๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋…ธ๋“œ์— ์˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

  • ๋…ธ๋“œ: ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์›์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ
  • ๋…ธ๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์  ํ• ๋‹น(allocation)๊ณผ ํ•ด์ œ(deallocation)๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์— system call์— ์˜ํ•ด ์ฒ˜๋ฆฌ
    • getnode(): ๋…ธ๋“œ๋ฅผ ํ• ๋‹น ํ›„ ๊ทธ ๋…ธ๋“œ์˜ ์ฃผ์†Œ ๋ฐ˜ํ™˜ (๋™์  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ ๊ฐˆ๋œ ์‹œ์ ์ด๋ฉด null ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜)
    • putnode(i): ์ฃผ์†Œ i์˜ ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ํ•ด์ œ ํ›„ ์ด๋ฅผ ๋™์  ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ˜ํ™˜ (๋ฉ”๋ชจ๋ฆฌ ์žฌํ™œ์šฉ ์œ„ํ•ด)

 

๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

  • ์—ฐ์† ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์—ฐ๊ฒฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • ๋…ธ๋“œ ์ €์žฅ ๋‚ด์šฉ
    • ์›์†Œ(element): ๋ฐ์ดํ„ฐ ์›์†Œ, data field
    • ๋งํฌ(link): ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ, ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ null ๋งํฌ ์ €์žฅ, link field
  • ์ ‘๊ทผ์ 
    • ์ฒซ ๋…ธ๋“œ = ํ—ค๋“œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ
  • ๋‹จ๋ฐฉํ–ฅ์˜ ์•„์‰ฌ์›€ → → ์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋“ฑ์žฅ

 

์ด์ค‘์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

  • ์ถ”๊ฐ€ ๋งํฌ ์‚ฌ์šฉํ•ด ์—ญ๋ฐฉํ–ฅ ์ˆœํšŒ ๊ฐ€๋Šฅ  
  • ๋…ธ๋“œ ์ €์žฅ ๋‚ด์šฉ
    • ์›์†Œ
    • ๋งํฌ: ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ
    • ๋งํฌ: ์ด์ „ ๋…ธ๋“œ์˜ ์ฃผ์†Œ
  • ์ ‘๊ทผ์ 
    • ํ—ค๋“œ๋…ธ๋“œ์˜ ์ฃผ์†Œ
    • ํ…Œ์ผ๋…ธ๋“œ์˜ ์ฃผ์†Œ

 

 

์›ํ˜•์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

  • ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋งํฌ = ํ—ค๋“œ๋…ธ๋“œ์˜ ์ฃผ์†Œ
  • ์ ‘๊ทผ์ : ํ—ค๋“œ๋…ธ๋“œ์˜ ์ฃผ์†Œ

 

ํ—ค๋”์™€ ํŠธ๋ ˆ์ผ๋Ÿฌ

  • ํ—ค๋“œ๋…ธ๋“œ ๋ฐ”๋กœ ์•ž์— ํŠน๋ณ„ํ•œ ํ—ค๋”(header) ๋…ธ๋“œ ์ถ”๊ฐ€ํ•ด ์ž‘์—… ํŽธ์˜์„ฑ ์ฆ์ง„
  • ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ํ…Œ์ผ๋…ธ๋“œ ๋ฐ”๋กœ ๋’ค์— ํŠน๋ณ„ํ•œ ํŠธ๋ ˆ์ผ๋Ÿฌ (trailer) ๋…ธ๋“œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ํŠน๋ณ„ ๋…ธ๋“œ ์ €์žฅ๋‚ด์šฉ
    • ๋ชจ์กฐ ์›์†Œ(=๋ฐ์ดํ„ฐ๋Š” ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์€ ํŠน๋ณ„ํ•œ ๋…ธ๋“œ, dummy element)
  • ์ ‘๊ทผ์ 
    • ํ—ค๋”๋…ธ๋“œ ๋˜๋Š” ํŠธ๋ ˆ์ผ๋Ÿฌ๋…ธ๋“œ์˜ ์ฃผ์†Œ

๋ฆฌ์ŠคํŠธ ADT (Abstract Data Type, ์ถ”์ƒ์ž๋ฃŒํ˜•)

  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์™€ ๋‹ค๋ฆ„. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ์ŠคํŠธ๋‚˜ ๋‹ค๋ฅธ ADT ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ
  • ์›์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋„๊ตฌ
    • ์ˆœ์œ„(rank)
  • ๋ฉ”์˜๋“œ
    • ์ผ๋ฐ˜ ๋ฉ”์˜๋“œ
      • boolean isEmpty(): ๋น„์–ด ์žˆ๋Š”์ง€ ์•ˆ ๋น„์–ด ์žˆ๋Š”์ง€ ๋ฐ˜ํ™˜
      • integer size(): ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ ๋ฐ˜ํ™˜
      • iterator elements()
    • ์ ‘๊ทผ ๋ฉ”์˜๋“œ
      • element get(r): ๋ฆฌ์ŠคํŠธ์—์„œ r์˜ ์ƒ๋Œ€์  ์œ„์น˜
    • ๊ฐฑ์‹  ๋ฉ”์˜๋“œ
      • element set(r, e)
      • add(r, e), addFirst(e), addLast(e): ์›์†Œ ์‚ฝ์ž… (ํŠน์ •ํ•œ ์œ„์น˜์— ์›์†Œ ์‚ฝ์ž… ํฌํ•จ)
      • element remove(r), element removeFirst(), element removeLast(): ์›์†Œ ์ œ๊ฑฐ (ํŠน์ •ํ•œ ์œ„์น˜์˜ ์›์†Œ ์‚ญ์ œ ํฌํ•จ)

๋‹จ์ˆœ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฆฌ์ŠคํŠธ ADT ๊ตฌํ˜„ (with C)

// ๋‹จ์ˆœ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฆฌ์ŠคํŠธ ADT ๊ตฌํ˜„

#include <stdio.h>
#include <stdlib.h>

// ๊ตฌ์กฐ์ฒด ์„ ์–ธ (์ƒˆ ๋…ธ๋“œ)
typedef struct ListNode 
{
    int data; //data field
    struct ListNode* link; // ์ž๊ธฐ์ฐธ์กฐ ๊ตฌ์กฐ์ฒด
}ListNode;

typedef struct
{
    ListNode* head; // head ํฌ์ธํ„ฐ ๊ตฌ์กฐ์ฒด
}LinkedListType;

void init(LinkedListType* L)
{
    L->head = NULL; // head๋Š” NULL๋กœ ์ดˆ๊ธฐํ™”
}

void addFirst(LinkedListType* L, int item)
{
    ListNode* node = malloc(sizeof(ListNode)); 
    // getnode ์—ญํ• , malloc์œผ๋กœ ์ง์ ‘ ๋…ธ๋“œ ์ƒ์„ฑ
    // malloc ํ•จ์ˆ˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•˜๋‹ˆ๊นŒ ํฌ์ธํ„ฐ๋กœ ๋ฐ›๊ธฐ
    // malloc ํ•จ์ˆ˜๋Š” ์–ด๋–ค ๋Œ€์ƒ์„ ์œ„ํ•œ ๊ณต๊ฐ„ ๋งŒ๋“ค์–ด์งˆ์ง€ ๋ชฐ๋ผ ํ•ญ์ƒ voidํ˜• ์ฃผ์†Œ ๋ฆฌํ„ด 
    node->data = item; // node์˜ data ํ•„๋“œ์— item ์ง‘์–ด๋„ฃ๊ธฐ
    node->link = L->head; // ๋‚ด๊ฐ€ ๋จผ์ € ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ, ํ˜„์žฌ ํ—ค๋“œ๊ฐ€ ๋‚ด ๋’ค๋กœ ๋“ค์–ด์™€์•ผํ•จ --> ํ˜„์žฌ head๊ฐ€ node link๋กœ
    L->head = node; // ๋‚ด๊ฐ€ ํ˜„์žฌ head
}   

void addLast(LinkedListType* L, int item)
{
    ListNode* node = malloc(sizeof(ListNode));
    ListNode* before = L->head;  
    while(before->link != NULL)
        before = before->link; // ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
    node->data = item;
    node->link = NULL;
    before->link = node;
}

void add(LinkedListType* L, int pos, int item)
{
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    ListNode* before = L->head;
    for(int i = 0; i < pos - 1; i++)
        before = before->link; // before -> link๋Š” before ์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ๋‹ˆ๊นŒ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์นธ์”ฉ ์ด๋™
    node->data = item;
    node->link = before->link;
    before->link = node;
}

// remove
void remove1(LinkedListType* L, int pos)
{
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    ListNode* before = L->head;
    for(int i = 0; i < pos - 1; i++)
        before = before->link;
    before->link = before->link->link; // ์—†์•จ ๋…ธ๋“œ ์—ฐ๊ฒฐ ๋Š๊ธฐ
}


void removeFirst(LinkedListType* L)
{
    L->head = L->head->link;
}

void removeLast(LinkedListType* L)
{
    ListNode* before = L->head;
    for(int i = 0; i < sizeof(L); i++)
        before = before->link;
    before->link = NULL;    
}

// position์— ์žˆ๋Š” ๊ฐ’ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
int get(LinkedListType* L, int pos)
{
    ListNode* p = L->head;
    for(int i = 1; i < pos; i++)
        p = p->link;
    return p->data;
}


void set(LinkedListType* L, int pos, int item)
{
    ListNode* p = L->head;
    for(int i = 1; i < pos; i++)
        p = p->link;
    p->data = item;
}

void printList(LinkedListType* L)
{
    for(ListNode* p = L->head; p != NULL; p = p->link)
        printf("[%d] -> ", p->data);
    printf("NULL\n");
}

// addLast ๊ตฌํ˜„, add๋ž‘ ๋น„์Šทํ•œ๋ฐ for๋ฌธ์—์„œ ์ข€ ์ƒ๊ฐํ•ด์•ผ ํ•จ
// ํ˜„์žฌ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ์ผ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ๊ฐ€๊ณ  ๊ทธ ๋…ธ๋“œ๊ฐ€ before ๋…ธ๋“œ๊ฐ€ ๋˜์–ด ๋‚ด๊ฐ€ ๊ฑ”๋ž‘ ์—ฐ๊ฒฐ๋˜์–ด์ง€๊ณ  ๋“ฑ๋“ฑ..
// remove, removeFirst, removeLast

void main()
{
    LinkedListType list;
    init(&list);
    
    addFirst(&list, 10); printList(&list);
    addFirst(&list, 20); printList(&list);
    addFirst(&list, 30); printList(&list);
    getchar(); // ์ž ๊น ๋ฉˆ์ถค
    add(&list, 1, 40); printList(&list);
    add(&list, 1, 50); printList(&list);
    add(&list, 3, 60); printList(&list);
    
    addLast(&list, 70); printList(&list);

    removeFirst(&list); printList(&list);
    removeLast(&list); printList(&list);
    remove1(&list, 3); printList(&list);

    int pos;
    printf("\n ๋ช‡ ๋ฒˆ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ• ๊นŒ์š”? ");
    scanf("%d", &pos);
    printf("%d๋ฒˆ ๋…ธ๋“œ์˜ ๊ฐ’์€ %d\n", pos, get(&list, pos));
}

๋ฐฐ์—ด๋กœ ๋ฆฌ์ŠคํŠธ ADT ๊ตฌํ˜„ (with C)

// ๋ฐฐ์—ด๋กœ ๋ฆฌ์ŠคํŠธ ADT ๊ตฌํ˜„

#include <stdio.h>
#include <stdlib.h>

#define SIZE 100

typedef struct // array๋กœ ์„ ์–ธ
{
    int V[SIZE]; // list ์—ญํ• ์„ ํ•  ๋ฐฐ์—ด 
    int n; // ์ „์ฒด list ์š”์†Œ ๊ฐœ์ˆ˜ ๊ธฐ์–ตํ•˜๋Š” ๋ณ€์ˆ˜
}ArrayList; // ์ด ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์„ ArrayList๋กœ ์„ ์–ธ

void init(ArrayList* L) // ์ฃผ์†Œ ์˜ค๋‹ˆ๊นŒ ํฌ์ธํ„ฐ L๋กœ ๋ฐ›๊ธฐ
{
    L->n = 0; // L ์›์†Œ์˜ ๊ฐœ์ˆ˜ 0๊ฐœ
}

// traverse method (์ ‘๊ทผ method)
void traverse(ArrayList* L)
{
    for(int i = 0; i < L->n; i++) // ์›์†Œ์˜ ๊ฐœ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰ element ๋ฐ”๋กœ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ๋น„์–ด์žˆ๋Š” ์นธ ๊ฐ€๋ฆฌํ‚ด
        printf("[%d] ", L->V[i]); // data field๊ฐ’
    printf("\n");
}

void add(ArrayList* L, int pos, int item) // pos: rank ์—ญํ• , item: ์‚ฝ์ž…๋  ๊ฐ’
{
    if(L->n == SIZE)
    {
        printf("fullListException...\n");
        exit(1); // ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ›„ ํ”„๋กœ๊ทธ๋žจ ๋๋‚ด๊ธฐ
    }
    // invalidPosException... 0 <= post <= L->n
    for(int i = L->n - 1; i >= pos; i--)
        L->V[i+1] = L->V[i]; // ํ•œ ์นธ์”ฉ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์œ„์น˜ ์ด๋™
    L->V[pos] = item;
    L->n++;
}

int remove1(ArrayList* L, int pos)
{
    // exception ์ฒ˜๋ฆฌ
    int item = L->V[pos]; // ๋‚˜์ค‘์— ์ด ๊ฐ’ return
    for(int i = pos + 1; i <= L->n - 1; i++)
        L->V[i - 1] = L->V[i];
    L->n--;
    return item;
}

void main()
{
    ArrayList list; // main์—์„œ ArrayList ์„ ์–ธ
    
    init(&list); // ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋ฉฐ ์ดˆ๊ธฐํ™” --> ๋ณ€๊ฒฝ๋˜๋Š” ๋‚ด์šฉ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ
    
    add(&list, 0, 10); traverse(&list);
    add(&list, 0, 20); traverse(&list);
    add(&list, 1, 30); traverse(&list);
    add(&list, 1, 40); traverse(&list);
    add(&list, 3, 50); traverse(&list);
    
    getchar();
    remove1(&list, 1); traverse(&list);
    remove1(&list, 2); traverse(&list);
}
728x90