๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/CS50 ์ฝ”์นญ์Šคํ„ฐ๋””

[CS50 ์ฝ”์นญ์Šคํ„ฐ๋””] 4์ฃผ์ฐจ_์•Œ๊ณ ๋ฆฌ์ฆ˜

by - ์˜คํŠธ - 2021. 2. 28.

 

[4์ฃผ์ฐจ ๊ฐœ๋…]

โœ”๏ธ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์„ ํ˜• ๊ฒ€์ƒ‰, ์ด์ง„ ๊ฒ€์ƒ‰

์„ ํ˜• ๊ฒ€์ƒ‰ : ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ทธ ๊ฐ’์ด ์†ํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌ์ด์ง„ ๊ฒ€์ƒ‰ : ๋งŒ์•ฝ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ฐฐ์—ด ์ค‘๊ฐ„ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉฐ ๊ทธ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ธ๋ฑ์Šค ๋˜๋Š” ํฐ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ธ๋ฑ์Šค๋กœ ์ด๋™์„ ๋ฐ˜๋ณต

 

โœ”๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‘œ๊ธฐ๋ฒ• - Big O, Big Ω

Big O : ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ƒํ•œ

Big Ω : ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ํ•˜ํ•œ

-> ์‹คํ–‰์‹œ๊ฐ„์˜ ์ƒํ•œ์ด ๋‚ฎ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ข‹๋‹ค

 

โœ”๏ธ ์„ ํ–‰ ๊ฒ€์ƒ‰ - ์„ ํ˜• ๊ฒ€์ƒ‰, ๊ตฌ์กฐ์ฒด

์„ ํ˜• ๊ฒ€์ƒ‰ : ์›ํ•˜๋Š” ์›์†Œ๊ฐ€ ๋ฐœ๊ฒฌ๋  ๋•Œ๊นŒ์ง€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ž๋ฃŒ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์ƒ‰ -> ์ •ํ™•ํ•˜์ง€๋งŒ ์•„์ฃผ ํšจ์œจ์ ์ด์ง€ ๋ชปํ•œ ๋ฐฉ๋ฒ• -> ์ž๋ฃŒ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ ๊ทธ ์–ด๋–ค ์ •๋ณด๋„ ์—†์–ด ํ•˜๋‚˜์”ฉ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉ

๊ตฌ์กฐ์ฒด : ์ž๋ฃŒ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ ๊ทธ ์–ด๋–ค ์ •๋ณด๋„ ์—†์–ด ํ•˜๋‚˜์”ฉ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉ -> ์ƒˆ๋กœ์šด ์ž๋ฃŒํ˜•์œผ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•ด์„œ ์ด๋ฆ„๊ณผ ๋ฒˆํ˜ธ๋ฅผ ๋ฌถ์–ด์คŒ

 

โœ”๏ธ ๋ฒ„๋ธ” ์ •๋ ฌ

๋ฒ„๋ธ” ์ •๋ ฌ :  ๋‘ ๊ฐœ์˜ ์ธ์ ‘ํ•œ ์ž๋ฃŒ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด์„œ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ •๋ ฌ

(๋‹จ์  : ๋‹จ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์ด ๊ตํ™˜ํ•˜๋Š” ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒ)

๋ฒ„๋ธ” ์ •๋ ฌ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ƒํ•œ์€ O(n^2)

๋ฒ„๋ธ” ์ •๋ ฌ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ํ•˜ํ•œ๋„ Ω(n^2)

 

โœ”๏ธ ์„ ํƒ ์ •๋ ฌ

์„ ํƒ ์ •๋ ฌ : ๋ฐฐ์—ด ์•ˆ์˜ ์ž๋ฃŒ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜(ํ˜น์€ ๊ฐ€์žฅ ํฐ ์ˆ˜)๋ฅผ ์ฐพ์•„ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜(ํ˜น์€ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์œ„์น˜)์˜ ์ˆ˜์™€ ๊ตํ™˜ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์˜ ์ •๋ ฌ

(์žฅ์  : ๊ตํ™˜ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”, ๋‹จ์  : ๊ฐ ์ž๋ฃŒ๋ฅผ ๋น„๊ตํ•˜๋Š” ํšŸ์ˆ˜๋Š” ์ฆ๊ฐ€)

์†Œ์š” ์‹œ๊ฐ„์˜ ์ƒํ•œ๊ณผ ํ•˜ํ•œ์€ ๋ฒ„๋ธ” ์ •๋ ฌ๊ณผ ๋™์ผ

 

โœ”๏ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹คํ–‰์‹œ๊ฐ„ Big O, Big Ω

์‹คํ–‰์‹œ๊ฐ„์˜ ์ƒํ•œ(Big O)

  O(n^2): ์„ ํƒ ์ •๋ ฌ, ๋ฒ„๋ธ” ์ •๋ ฌ

  O(n log n)

  O(n): ์„ ํ˜• ๊ฒ€์ƒ‰

  O(log n): ์ด์ง„ ๊ฒ€์ƒ‰

  O(1)

์‹คํ–‰์‹œ๊ฐ„์˜ ํ•˜ํ•œ(Big Ω)

  Ω(n^2): ์„ ํƒ ์ •๋ ฌ

  Ω(n log n)

  Ω(n): ๋ฒ„๋ธ” ์ •๋ ฌ

  Ω(log n)

  Ω(1): ์„ ํ˜• ๊ฒ€์ƒ‰, ์ด์ง„ ๊ฒ€์ƒ‰

 

โœ”๏ธ ์žฌ๊ท€

์žฌ๊ท€ : ํ•จ์ˆ˜๊ฐ€ ๋ณธ์ธ ์Šค์Šค๋กœ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ, ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์žฌ์‚ฌ์šฉ -> ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ ์งง์•„์ ธ ํšจ์œจ์ ์ธ ์ฝ”๋”ฉ ๊ฐ€๋Šฅ

 

โœ”๏ธ ๋ณ‘ํ•ฉ ์ •๋ ฌ

๋ณ‘ํ•ฉ ์ •๋ ฌ : ์›์†Œ๊ฐ€ ํ•œ ๊ฐœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋‹ค๊ฐ€ ๋‹ค์‹œ ํ•ฉ์ณ๋‚˜๊ฐ€๋ฉฐ ์ •๋ ฌ์„ ํ•˜๋Š” ๋ฐฉ์‹

๋ณ‘ํ•ฉ ์ •๋ ฌ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ์ƒํ•œ์€ O(n log n)

์‹คํ–‰ ์‹œ๊ฐ„์˜ ํ•˜ํ•œ๋„ Ω(n log n) 

 

[4์ฃผ์ฐจ ํŒ€๋ณ„๋ฏธ์…˜]

#include <stdio.h>
#include <cs50.h>

int* SelectionSort(int a[], int size){ // ์„ ํƒ ์ •๋ ฌ ํ•จ์ˆ˜
    int min;
    int temp; // ์„œ๋กœ ๊ตํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ์ž„์‹œ ๋ณ€์ˆ˜
    
    for(int i=0; i<size-1; i++){ // ์ฒซ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์„ ํƒ ์ •๋ ฌ์„ (n-1)๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์ˆ˜ํ–‰
        min = i; // ๊ธฐ์ค€ ์œ„์น˜ ์›์†Œ์˜ ์ธ๋ฑ์Šค i๋ฅผ ๋ณ€์ˆ˜ min์— ์„ค์ •
        for(int j=i; j<size; j++){ // i๋ฒˆ ์›์†Œ๋กœ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์›์†Œ๊นŒ์ง€ ๋น„๊ตํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ณ€์ˆ˜ min์— ์ €์žฅ
            if(a[j] < a[min]) // ๋งŒ์•ฝ min๋ณด๋‹ค ์ž‘์€ j๋ฒˆ์งธ ์›์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
                min = j; // j๋ฅผ ๋ณ€์ˆ˜ min์— ์„ค์ •
        }
        
        temp = a[i]; // ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ a[min]๊ณผ ๊ธฐ์ค€ ์›์†Œ a[i]๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•˜๋Š” ๊ณผ์ •
        a[i] = a[min]; // "
        a[min] = temp; // "

    }
    
    return a; // ๋ฐฐ์—ด ๋ฆฌํ„ด
}

int main(){
    
   printf("์ž…๋ ฅ๊ฐ’ : ");
   int size = 5; // ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ถœ๋ ฅ
   
   int list1[5] = {1,1,1,3,2};
   for(int i=0; i<size; i++){ // list1 ์ถœ๋ ฅ
        printf("%d", list1[i]);
    }
   SelectionSort(list1, size);
   int* num1 = SelectionSort(list1, size); // SelectionSort ํ•จ์ˆ˜์—์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ num1์— ๋ฐ˜ํ™˜
   
   printf(", ");
   
   int list2[5] = {2,1,1,3,1}; 
   for(int i=0; i<size; i++){ // list2 ์ถœ๋ ฅ
        printf("%d", list2[i]);
    }
    SelectionSort(list2, size);
   int* num2 = SelectionSort(list2, size); // SelectionSort ํ•จ์ˆ˜์—์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ num2์— ๋ฐ˜ํ™˜
   
    printf("\n");
   
   if (num1[0] == num2[0] && num1[1] == num2[1] && num1[2] == num2[2] && num1[3] == num2[3] && num1[4] == num2[4]){ // ์ •๋ ฌ๋œ list1๊ณผ list2๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์—
       printf("์ถœ๋ ฅ๊ฐ’ : True"); // true๋ฅผ ์ถœ๋ ฅ
   } else { // ๋งŒ์•ฝ ํ•˜๋‚˜์˜ ์กฐ๊ฑด์ด๋ผ๋„ ๋‹ค๋ฅด๋‹ค๋ฉด
       printf("์ถœ๋ ฅ๊ฐ’ : False"); // false ์ถœ๋ ฅ
   }
}