"이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬" λ‚΄μš©μ„ 기반으둜 μ œμž‘ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

(https://www.youtube.com/watch?v=KGyK-pNvWos&t=2349s)

 

 

μ •λ ¬μ΄λž€?

- 데이터λ₯Ό νŠΉμ •ν•œ 기쀀에 따라 μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λŠ” 것이닀.

- λ¬Έμ œμ— 따라 μ μ ˆν•œ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄ μ‚¬μš©λœλ‹€.

 

μœ„μ™€ 같이 μ •λ ¬λ˜μ§€ μ•Šμ€ μˆ˜μ—΄μ„ μ •λ ¬ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όλ κΉŒ ?

 

μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ—λŠ” 크게 4κ°€μ§€κ°€ μžˆλ‹€.

 

1. 선택 μ •λ ¬ 

     - μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 데이터 μ€‘μ—μ„œ κ°€μž₯ μž‘μ€ 데이터λ₯Ό 선택해 맨 μ•žμ— μžˆλŠ” 데이터와 λ°”κΎΈλŠ” 것을 λ°˜λ³΅ν•œλ‹€.

7 5 9 0 3 1 6 2 4 8

첫번째 λ‹¨κ³„μ—μ„œλŠ” 0이 제일 μž‘μœΌλ―€λ‘œ 0κ³Ό 7을 κ΅ν™˜ν•œλ‹€.

 

0 5 9 7 3 1 6 2 4 8

λ‘λ²ˆμ§Έ λ‹¨κ³„μ—μ„œλŠ” 1이 제일  μž‘μœΌλ―€λ‘œ 5와 κ΅ν™˜ν•œλ‹€.

 

0 1 9 7 3 5 6 2 4 8

μ΄λ ‡κ²Œ 단계λ₯Ό μ§„ν–‰ν•΄λ‚˜κ°€λ‹€ 보면 κ²°κ΅­ 0λΆ€ν„° 9κΉŒμ§€ 정렬이 λœλ‹€.

 

μ‹œκ°„λ³΅μž‘λ„ : O(N^2)

 

μ†ŒμŠ€μ½”λ“œ

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
            for(int i=0;i<arr.length;i++){
                int min_idx = i;
                for(int j=i+1;j<arr.length;j++){
                    if(arr[min_idx] > arr[j]){
                        min_idx = j;
                    }
                }
                int temp = arr[i];
                arr[i] = arr[min_idx];
                arr[min_idx] = temp;
            }
        for (int num : arr) {
            System.out.print(num+" ");
        }
        }

}

 

2. μ‚½μž… μ •λ ¬

     - μ²˜λ¦¬λ˜μ§€ μ•Šμ€ 데이터λ₯Ό ν•˜λ‚˜μ”© 골라 μ μ ˆν•œ μœ„μΉ˜μ— μ‚½μž…ν•œλ‹€.

     - 선택 정렬보닀 더 효율적으둜 λ™μž‘ν•œλ‹€.

 

7 5 9 0 3 1 6 2 4 8

첫번째 λ‹¨κ³„μ—μ„œλŠ” 5의 μœ„μΉ˜λ₯Ό κ²°μ •ν•œλ‹€. 7의 였λ₯Έμͺ½ or μ™Όμͺ½μœΌλ‘œ κ°€κ²Œ λ˜λŠ”λ° 7보닀 μž‘κΈ° λ•Œλ¬Έμ— 7의 μ™Όμͺ½μœΌλ‘œ μ΄λ™ν•œλ‹€.

 

5 7 9 0 3 1 6 2 4 8

λ‘λ²ˆμ§Έ λ‹¨κ³„μ—μ„œλŠ” 9의 μœ„μΉ˜λ₯Ό μ •ν•œλ‹€. ν•˜μ§€λ§Œ μ•žμ— μžˆλŠ” 두 개의 μˆ«μžλ³΄λ‹€ 9κ°€ 더 ν¬λ―€λ‘œ μœ„μΉ˜λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€.
(μ •ν™•νžˆλŠ” λ°”λ‘œ μ•žμ— 7보닀 μ»€μ„œ λ°”λ‘œ 정렬을 λ©ˆμΆ˜λ‹€,)

 

μ΄λŸ°μ‹μœΌλ‘œ 정렬을 μ§„ν–‰ν•˜λ©΄ 0λΆ€ν„° 9κΉŒμ§€ 정렬이 λœλ‹€.

 

μ‹œκ°„ λ³΅μž‘λ„: O(N^2)

 

μ†ŒμŠ€μ½”λ“œ

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
            for(int i=1;i<arr.length;i++){
                for(int j=i;j>0;j--){
                    if(arr[j-1] > arr[j]){
                        int temp = arr[j];
                        arr[j] = arr[j-1];
                        arr[j-1] = temp;
                    }
                    else break;
                }

            }
        for (int num : arr) {
            System.out.print(num+" ");
        }
        }

}

 

3. 퀡 μ •λ ¬

     - κΈ°μ€€ 데이터λ₯Ό μ„€μ •ν•˜κ³  κ·Έ 기쀀보닀 큰 데이터와 μž‘μ€ λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό λ³€κ²½

     - ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ μ •λ ¬ 라이브러리의 κ·Όκ°„

     - 보톡 첫 번째 데이터λ₯Ό κΈ°μ€€(pivot)으둜 ν•œλ‹€.

 

5 7 9 0 3 1 6 2 4 8

첫번째 λ‹¨κ³„μ—μ„œλŠ” 5λ₯Ό κΈ°μ€€μœΌλ‘œ ν•œλ‹€. 

κ·Έλ ‡λ‹€λ©΄ μ™Όμͺ½μ—μ„œλΆ€ν„° 7은 5보닀 크기에 μ„ νƒλ˜κ³  , 였λ₯Έμͺ½μ—μ„œλΆ€ν„°μ˜ 4λŠ” 5보닀 μž‘κΈ°μ— μ„ νƒλœλ‹€.

이제 λ‘˜μ˜ μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€.

5 4 9 0 3 1 6 2 7 8

이제 μͺ½μ—μ„œλΆ€ν„° 9λŠ” 5보닀 크기에 μ„ νƒλ˜κ³  , 였λ₯Έμͺ½μ—μ„œλΆ€ν„°μ˜ 2λŠ” 5보닀 μž‘κΈ°μ— μ„ νƒλœλ‹€.

λ‹€μ‹œ λ‘˜μ˜ μœ„μΉ˜λ₯Ό λ°”κΎΌλ‹€.

 

μ΄λ ‡κ²Œ μ§„ν–‰ν•˜λ‹€λ³΄λ©΄ λ°μ΄ν„°μ˜ μœ„μΉ˜κ°€ μ—‡κ°ˆλ¦¬λŠ” μˆœκ°„μ΄ μ˜¬κ²ƒμ΄λ‹€.

κ·Έλ•Œ μž‘μ€ 데이터와 ν”Όλ²—κ°’μ˜ μœ„μΉ˜λ₯Ό λ³€κ²½ν•œλ‹€

 

1 4 2 0 3 5 6 9 7 8

μ΄λ ‡κ²Œ 되면 μ™Όμͺ½ λ°μ΄ν„°λŠ” 5보닀 μž‘κ³  , 였λ₯Έμͺ½ λ°μ΄ν„°λŠ” 5보닀 크닀.

이처럼 피벗을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό λ‚˜λˆ„λŠ” 것을 뢄할이라고 ν•œλ‹€.

 

μ•žμ—μ„œ μ§„ν–‰ν–ˆλ˜ κ²ƒμ²˜λŸΌ λΆ„ν• λœ λ°μ΄ν„°μ—μ„œ λ‹€μ‹œ 퀡정렬을 μ μš©ν•˜λ©΄ λœλ‹€.

 

μ‹œκ°„λ³΅μž‘λ„ : 일반적으둜 O(NlogN) , μ΅œμ•…μ˜ 경우 O(N^2)

 

μ†ŒμŠ€μ½”λ“œ

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
        quickSort(arr,0,arr.length-1);
        for (int num : arr) {
            System.out.print(num+" ");
        }
        }

        public static void quickSort(int[] arr,int start,int end){
            if(start >= end) return;

            int pivot = start;
            int left = start+1;
            int right = end;

            while (left <= right){
                while (left <= end && arr[left] <= arr[pivot]) left++;
                while(right > start && arr[right] >= arr[pivot]) right--;

                if(left > right){
                    int temp = arr[pivot];
                    arr[pivot] = arr[right];
                    arr[right] = temp;
                }
                else{
                    int temp = arr[left];
                    arr[left] = arr[right];
                    arr[right] = temp;
                }
            }
            quickSort(arr,start,right-1);
            quickSort(arr,right+1,end);
        }

}

 

4. κ³„μˆ˜ μ •λ ¬

    - νŠΉμ •ν•œ 쑰건이 λΆ€ν•©ν•  λ•Œλ§Œ 맀우 λΉ λ₯΄κ²Œ λ™μž‘ν•œλ‹€.

    - λ°μ΄ν„°μ˜ 크기 λ²”μœ„κ°€ μ œν•œλ˜μ–΄ μ •μˆ˜ ν˜•νƒœλ‘œ ν‘œν˜„ν•  수 μžˆμ„λ•Œλ§Œ κ°€λŠ₯ν•˜λ‹€.

 

0 0 0 0 0 0 0 0 0 0

λ¨Όμ € 크기가 0 인 배열을 λ§Œλ“€μ–΄μ€€λ‹€.

 

7 7 1 1 2 2 3 3 4 5

λ§Œμ•½ 이런 배열이 μžˆλ‹€λ©΄ 각각의 데이터가 λ‚˜μ˜€λŠ” 숫자λ₯Ό μΉ΄μš΄νŒ…ν•˜κ³  배열에 μ§‘μ–΄ λ„£λŠ” λ‹€λ©΄ 효과적일 것이닀.

 

λ¨Όμ € λ§Œλ“  0 배열에 μ μš©μ‹œμΌœλ³΄μž

0 2 2 2 1 1 0 2 0 0

μˆ«μžλ“€μ΄ λ“±μž₯ν•œ 횟수만큼 배열에 ν”ŒλŸ¬μŠ€λ₯Ό ν•΄μ£Όμ–΄ λ„£μ–΄μ£Όμ—ˆλ‹€.

 

이제 이것을 κ·ΈλŒ€λ‘œ 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.

 

이 μ•Œκ³ λ¦¬μ¦˜μ€ μ΅œμ•…μ˜ κ²½μš°μ—λ„ O(N+K)λ₯Ό 보μž₯ν•˜μ§€λ§Œ κ²½μš°μ— 따라선 μ΅œμ•…μ˜ νš¨μœ¨μ„ λ‚Ό μˆ˜λ„ μžˆλ‹€.

ex) 0κ³Ό 9밖에 데이터가 μ—†λŠ” κ²½μš°μ—λŠ” 데이터가 두 κ°œλ°–μ— μ—†λŠ” 데 크기가 10인 배열을 λ§Œλ“€μ–΄μ„œ μ •λ ¬ν•΄μ•Όν•œλ‹€.

 

λ”°λΌμ„œ, λ™μΌν•œ 값이 μ—¬λŸ¬κ°œμΌ 경우 효과적으둜 μž‘λ™ν•  수 μžˆλ‹€.

 

μ†ŒμŠ€μ½”λ“œ

import java.util.*;

public class Solution {
    public static void main(String[] args) {
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        int[] sort = new int[arr.length+1];

        for(int i=0;i<arr.length;i++){
            sort[arr[i]] ++;
        }

        for(int i=0;i<sort.length;i++){
            for(int j=0;j<sort[i];j++){
                System.out.print(i+" ");
            }
        }
        }

}

+ Recent posts