๊ด€๋ฆฌ ๋ฉ”๋‰ด

Tech Log ๐Ÿ› ๏ธ

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€? ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

sehaan 2023. 4. 23. 23:24

"์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค 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+" ");
            }
        }
        }

}