Skip to content

Latest commit

ย 

History

History
386 lines (279 loc) ยท 15 KB

File metadata and controls

386 lines (279 loc) ยท 15 KB

๋™์  ๊ณ„ํš๋ฒ•๊ณผ ๋ถ„ํ• ์ •๋ณต

1. ๋™์  ๊ณ„ํš๋ฒ•(DP)

๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š”, ์šฐ์„  ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ํ’€์–ด๋‚˜๊ฐ€๋‹ค๋ณด๋ฉด ์ด์ „์— ๊ตฌํ•ด๋‘” ๋” ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ํ™œ์šฉ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ฐพ์•˜์„ ๋•Œ ์ ํ™”์‹์„ ๋„์ถœํ•ด๋‚ด์–ด ๋™์  ๊ณ„ํš๋ฒ•์„ ์ ์šฉ์‹œํ‚ค์ž

๐ŸŒ ๊ฐœ๋…

๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ•, ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ 

  • ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ ํ›„, ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋ฅผ ํ™œ์šฉํ•ด์„œ, ๋ณด๋‹ค ํฐ ํฌ๊ธฐ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ, ์ตœ์ข…์ ์œผ๋กœ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•์œผ๋กœ, ๊ฐ€์žฅ ์ตœํ•˜์œ„ ํ•ด๋‹ต์„ ๊ตฌํ•œ ํ›„, ์ด๋ฅผ ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์ƒ์œ„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๊ฐ€๋Š” ๋ฐฉ์‹
  • ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ, ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ’€๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์ฆ‰, ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. ์‹คํ–‰์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜ํ•™์  ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • Memoization ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•จ

๐ŸŒ ์ ‘๊ทผ ๋ฐฉ์‹

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

๐ŸŒ ์ข…๋ฅ˜

  1. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
  2. ๋ฐฐ๋‚ญ ๋ฌธ์ œ
  3. ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด
  4. ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ
  5. ์ตœ์†Œ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ
  6. ๋งคํŠธ๋ฆญ์Šค ์ฒด์ธ ๊ณฑ์…ˆ
  7. ํ–‰๋ ฌ ๊ฒฝ๋กœ ๋ฌธ์ œ

๐ŸŒ Memoization ๊ธฐ๋ฒ•์ด๋ž€?

  • Memoization (๋ฉ”๋ชจ์ด์ œ์ด์…˜) ์ด๋ž€: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ, ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ์ „์ฒด ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ 

  • ๋ฌธ์ œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐค ๋•Œ, ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ค‘๋ณต๋˜์–ด, ์žฌํ™œ์šฉ๋จ

    • ์˜ˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด 1 1 2 3 5 8 โ€ฆ. 1 1๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋’ค์˜ ๋ชจ๋“  ํ•ญ์€ ๋ฐ”๋กœ ์•ž ๋‘ํ•ญ์˜ ํ•ฉ์˜ ์ˆ˜์—ด

    ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์—์„œ ์žฌ๊ท€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ’€ ๊ฒฝ์šฐ, ๊ฐ™์€ ์—ฐ์‚ฐ์„ ๊ณ„์† ๋ฐ˜๋ณตํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋•Œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๊ฐ™์€ ์ž‘์—…์„ ๋˜ํ’€์ด ํ•˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•˜๋ฉด ํšจ์œจ์ ์ด๋‹ค.

    • return f(n) = f(n-1) + f(n-2)
  • ์ฝ”๋“œ[์žฌ๊ท€] : ์‹œ๊ฐ„ ๋ณต์žก๋„ O(2^n)

import java.util.Scanner;

public class Fibonacci {
    private static int fibonacci(int n){
        if(n <= 1) return n;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        int result = fibonacci(n);
        System.out.printf("ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ %d๋ฒˆ์งธ ๊ฐ’ : %d", n, result);
    }
}
  • ์ฝ”๋“œ 2[๋™์  ๋ฐฉ๋ฒ• ์ด์šฉ] : ์‹œ๊ฐ„ ๋ณต์žก๋„ O(N)
public class Dynamic {
    
    public int dynamicFunc(int data){
        Integer[] cache = new Integer[data+1];
        cache[0] = 0;
        cache[1] = 1;
        for(int index=2; index<data+1; index++){
            cache[index] = cache[index-1] + cache[index-2];
        }
        return cache[data];
    }

    public static void main(String[] args){
        Dynamic dObject = new Dynamic();
        dObject.dynamicFunc(10);
    }
}

2. ๋ถ„ํ•  ์ •๋ณต

๋ถ„ํ•  ์ •๋ณต์€ ์ฃผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ 

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

๐ŸŒ Merge Sort[๋ณ‘ํ•ฉ ์ •๋ ฌ]

๊ด€๋ จ ๋™์ž‘ ๋ฐฉ๋ฒ•์€ ๋…ธ์…˜์—..

๊ฐœ๋…

  1. ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜๋กœ, ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  2. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๊ฑฐ์˜ O(n log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ •๋ ฌ์— ๋งŽ์ด ์‚ฌ์šฉ
  3. ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ ์–‘์ด ๋งŽ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๋‚˜ ์•ˆ์ •์ ์ธ ์ •๋ ฌ์„ ์›ํ•  ๋•Œ ์ฃผ๋กœ ์„ ํƒ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋™์ž‘๋ฐฉ๋ฒ•

์•„๋ž˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ž‘์€ ๋ฐฐ์—ด๋ถ€ํ„ฐ ์ •๋ ฌํ•˜์—ฌ ํ•ฉ์ณ๋‚˜๊ฐ€๋ฉด, ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ•ฉ๋ณ‘ ์ •๋ ฌ์€ ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๊ฐ€ ๋˜๋ฏ€๋กœ, ์•„๋ž˜ ์„ธ ๋‹จ๊ณ„๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด ๋‚ด๋‚˜๊ฐ€๋ฉฐ ์ •๋ ฌ์ด ์™„์„ฑ๋œ๋‹ค.

  1. ๋ถ„ํ• (Divide) : ์ •๋ ฌํ•  ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ์ด๋ฅผ ๊ณ„์†ํ•ด์„œ ์ž‘์€ ๋ฐฐ์—ด์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ถ„ํ• 
  2. ์ •๋ณต(Conquer) : ๋ถ„ํ• ๋œ ์ž‘์€ ๋ฐฐ์—ด์„ ์ •๋ ฌ, ๋งŒ์•ฝ ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ด๊ฑฐ๋‚˜ 0์ด๋ผ๋ฉด ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ
  3. ํ•ฉ๋ณ‘(Merge) : ์ •๋ ฌ๋œ ์ž‘์€ ๋ฐฐ์—ด๋“ค์„ ํ•˜๋‚˜๋กœ ํ•ฉ๋ณ‘ํ•œ๋‹ค. ์ด๋•Œ, ๋‘ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ์น˜๋Š”๋ฐ, ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋ณ‘ํ•ฉ
import java.util.ArrayList;

public class MergeSort {

    private ArrayList<Integer> mergeFunc(ArrayList<Integer> leftArr, ArrayList<Integer> rightArr) {

        ArrayList<Integer> mergedList = new ArrayList<Integer>();
        int leftPoint = 0;
        int rightPoint = 0;

        // CASE 1 : left/right๊ฐ€ ๋‘˜ ๋‹ค ์žˆ์„ ๋•Œ
        while(leftArr.size() > leftPoint && rightArr.size() > rightPoint){
            //์ž๋ฆฌ๋ฐ”๊ฟˆ์ด ์ผ์–ด๋‚˜๋Š” ์กฐ๊ฑด
            if(leftArr.get(rightPoint) > rightArr.get(rightPoint)){
                mergedList.add(rightArr.get(rightPoint));
                rightPoint += 1;
            }
            else{
                mergedList.add(leftArr.get(leftPoint));
                leftPoint += 1;
            }
        }

        // CASE 2 : right ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ
        while(leftArr.size() > leftPoint){
            mergedList.add(leftArr.get(leftPoint));
            leftPoint += 1;
        }

        // CASE 3 : left ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ
        while(rightArr.size() > rightPoint){
            mergedList.add(rightArr.get(rightPoint));
            rightPoint += 1;
        }

        return mergedList;
  }

    public ArrayList<Integer> margeSplitFunc(ArrayList<Integer> arrayList) {
        if(arrayList.size() <= 1){return arrayList;}
        // ์ค‘๊ฐ„๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๋Š๋‚Œ
        int medium = arrayList.size()/2;

        ArrayList<Integer> leftArr = new ArrayList<Integer>();
        ArrayList<Integer> rightArr = new ArrayList<Integer>();

        leftArr = new ArrayList<Integer>(arrayList.subList(0, medium));
        rightArr = new ArrayList<Integer>(arrayList.subList(medium, arrayList.size()));

        // ์ •๋ ฌํ•˜๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
       return this.mergeFunc(leftArr, rightArr);
    }

    public static void main(String[] args){
        ArrayList<Integer> testData = new ArrayList<>();

        for(int index=0; index<100; index++){
            testData.add((int)(Math.random()*100));
        }

        System.out.println(testData);
        MergeSort mergeSort = new MergeSort();
        System.out.println(mergeSort.margeSplitFunc(testData));
    }
}

ํ•ฉ๋ณ‘ ์ •๋ ฌ ํŠน์ง•

  1. ์•ˆ์ •์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋™์ผํ•œ ๊ฐ’์˜ ์ƒ๋Œ€์ ์ธ ์ˆœ์„œ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ์™ธ๋ถ€ ์ •๋ ฌ์— ์ ํ•ฉ : ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ชจ๋‘ ์˜ฌ๋ฆฌ๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  3. ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ•„์š” : ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ  ํ•ฉ์น˜๋Š” ๊ณผ์ •์—์„œ ์ž„์‹œ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  4. ํ‰๊ท  ๋ฐ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  5. ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  6. ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ๋„ ํšจ์œจ์ : ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ํ•ฉ์น˜๋Š” ๊ฒฝ์šฐ์—๋„ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™

๐ŸŒ ํ€ต ์ •๋ ฌ(QuickSort)

ํ€ต์ •๋ ฌ์˜ ์ •์˜

  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ์„ค์ •, ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋ฉด ?

  • ๊ธฐ์ค€์„ ์„ค์ •ํ•œ ๋‹ค์Œ ํฐ ์ˆ˜์™€ ์ž‘์€์ˆ˜๋ฅผ ๊ตํ™˜ํ•œ ํ›„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹

  • ํ”ผ๋ฒ—์ด ์‚ฌ์šฉ

    โ‡’ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž ๊ตํ™˜์‹œ, ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€

    โ‡’ ํ€ธ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „ ํ”ผ๋ฒ—์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ• ๊ฒƒ์ธ์ง€ ๋ฏธ๋ฆฌ ๋ช…์‹œ ํ•ด์•ผ ํ•จ

  • ํ”ผ๋ฒ—๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜๋Š” ๋น„๊ต ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ์‹œ๊ฐ„ ๋ฉด์—์„œ๋Š” ์กฐ๊ธˆ ๋น„ํšจ์œจ์  but, ์ง๊ด€์ ์ด๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฝ๋‹ค

ํ˜ธ์–ด ๋ถ„ํ•  ๋ฐฉ์‹

  • ์žฌ๊ท€ ํ•จ์ˆ˜ ๋™์ž‘์›๋ฆฌ๊ฐ€ ๊ฐ™์Œ

    โ‡’ ์ข…๋ฃŒ์กฐ๊ฑด์ด ์žˆ์–ด์•ผ ํ•จ : ํ˜„์žฌ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ

  1. ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์ •ํ•œ๋‹ค
  2. ํ”ผ๋ฒ— ์„ค์ •ํ•œ ๋’ค์—๋Š” ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์Œ
  3. ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๊ตํ™˜

ํ€ต ์ •๋ ฌ ๋ฐฉ์‹(ํ˜ธ์–ด ๋ถ„ํ•  ๋ฐฉ์‹ ์˜ˆ์‹œ)

โœจ 1ํŒŒํŠธ

  1. ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ค์ •ํ•˜๋ฏ€๋กœ ํ”ผ๋ฒ—์€ โ€˜5โ€™ ์ดํ›„์— ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ โ€˜5โ€™๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ โ€˜7โ€™์ด ์„ ํƒ, ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ โ€˜5โ€™๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ ํƒ๋˜๋ฏ€๋กœ โ€˜4โ€™๊ฐ€ ์„ ํƒ โ‡’ ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜ ์„œ๋กœ ๋ณ€๊ฒฝ

  1. ๊ทธ๋‹ค์Œ ๋‹ค์‹œ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ์ฐพ๊ณ , ๊ทธ ๋’ค ๋‘ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝ

  1. ๊ทธ ๋‹ค์Œ ๋‹ค์‹œ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
    1. ๋‹จ, ํ˜„์žฌ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š” ๊ฐ’์˜ ์œ„์น˜๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.
    2. ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ’์ด ์—‡๊ฐˆ๋ฆฐ ๊ฒฝ์šฐ์—๋Š” โ€˜์ž‘์€ ๋ฐ์ดํ„ฐโ€™์™€ โ€˜ํ”ผ๋ฒ—โ€™์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
    3. ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ โ€˜1โ€™๊ณผ ํ”ผ๋ฒ—์ธ โ€˜5โ€™์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ถ„ํ•  ์ˆ˜ํ–‰

  1. ๋ถ„ํ•  ์™„๋ฃŒ : ์ด์™€ ๊ฐ™์ด ํ”ผ๋ฒ—์ด ์ด๋™ํ•œ ์ƒํƒœ์—์„œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์™€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด์ž
    1. ์ด์ œ โ€˜5โ€™ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ โ€˜5๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” โ€˜5โ€™๋ณด๋‹ค ํฌ๋‹ค๋Š” ํŠน์ง•
    2. ๋ถ„ํ•  ํ˜น์€ ํŒŒํ‹ฐ์…˜ : ํ”ผ๋ฒ—์˜ ์™ผ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜, ํ”ผ๋ฒ—์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜

โœจ 2ํŒŒํŠธ

์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ •๋ ฌ ์ง„ํ–‰, ๊ตฌ์ฒด์ ์ธ ์ •๋ ฌ ๊ณผ์ •์€ ๋™์ผ

โœจ 3ํŒŒํŠธ

์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ •๋ ฌ ์ง„ํ–‰, ๊ตฌ์ฒด์ ์ธ ์ •๋ ฌ ๊ณผ์ •์€ ๋™์ผ

ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

  • ํ‰๊ท ์  ์‹œ๊ฐ„๋ณต์žก๋„ : $O(NlogN)$

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„ : $O(N^2)$

    โ‡’ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ์ž‘๋™

  • ์•ž์— ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์˜ ๋น„ํ•ด ์—„์ฒญ ๋น ๋ฅธ ํŽธ

  • ๋ถ„ํ• ์ด ์ด๋ฃจ์–ด์ง€๋Š” ํšŸ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๊ฐ์†Œ

package Danymic;

import java.util.Scanner;

public class QuickSortEx {

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int arr[] = {3, 33, 38, 5, 2, 7, 15, 36, 26, 27, 2};

        System.out.println("์ •๋ ฌ ์ „ :"+arr);

        System.out.println("์ •๋ ฌ ํ›„");
        quickSort(arr, 0, arr.length-1);
    }

    public static void quickSort(int[] array, int left, int right) {
        if(left >= right) return;

        //๋ถ„ํ• 
        int pivot = partition(array, left, right);

        // ์ž๊ธฐ ์ž์‹ ์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ€๋ฆ„
        quickSort(array, left, pivot);
        quickSort(array, pivot+1, right);
    }

    private static int partition(int[] array, int left, int right) {
        int pivot = array[left];
        int i = left, j= right;
        while (i < j){
            // ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ j๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฐพ์Œ
            while(pivot < array[j]){
                j--;
            }
            while(i<j && pivot >= array[i]){
                i++;
            }
            swap(array, i, j);
        }
        array[left] = array[i];
        array[i] = pivot;
        
        return i;
        
    }

    private static void swap(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}

arrayList๋ฅผ ์ด์šฉํ•œ ๋™์ž‘์›๋ฆฌ

import java.util.ArrayList;
import java.util.Arrays;

public class QuickSort {
    public ArrayList<Integer> sort(ArrayList<Integer> dataList) {
        if (dataList.size() <= 1) {
            return dataList;
        }
        int pivot = dataList.get(0);

        ArrayList<Integer> leftArr = new ArrayList<Integer>();
        ArrayList<Integer> rightArr = new ArrayList<Integer>();

        for (int index = 1; index < dataList.size(); index++) {
            if (dataList.get(index) > pivot) {
                rightArr.add(dataList.get(index));
            } else {
                leftArr.add(dataList.get(index));
            }
        }

      
        ArrayList<Integer> mergedArr = new ArrayList<Integer>();
        mergedArr.addAll(sort(leftArr));
        mergedArr.addAll(Arrays.asList(pivot));
        mergedArr.addAll(sort(rightArr));

        return mergedArr;
    }

    public static void main(String[] args) {
        ArrayList<Integer> testData = new ArrayList<Integer>();

        for (int index = 0; index < 100; index++) {
            testData.add((int)(Math.random() * 100));
        }
        QuickSort qSort = new QuickSort();
        System.out.println(qSort.sort(testData));
    }
}

๐ŸŒ ์ข…๋ฅ˜

  1. ํ•ฉ๋ณ‘ ์ •๋ ฌ
  2. ํ€ต ์ •๋ ฌ
  3. ๊ฑฐ๋“ญ์ œ๊ณฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  4. ๋ณ‘๋ ฌ ํ–‰๋ ฌ ๊ณฑ์…ˆ
  5. ์ตœ๊ทผ์ ‘ ์  ์Œ ์ฐพ๊ธฐ
  6. ์ตœ๋Œ€ ๋ถ€๋ถ„๋ฐฐ์—ด ๋ฌธ์ œ

๐ŸŒ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

  • ๊ณตํ†ต์ 
    • ๋ฌธ์ œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ, ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„ํ• 
  • ์ฐจ์ด์ 
    • ๋™์  ๊ณ„ํš๋ฒ•
      • ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์ค‘๋ณต๋˜์–ด, ์ƒ์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‹œ ์žฌํ™œ์šฉ๋จ
      • Memoization ๊ธฐ๋ฒ• ์‚ฌ์šฉ (๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์ €์žฅํ•ด์„œ ์žฌํ™œ์šฉํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ)
    • ๋ถ„ํ•  ์ •๋ณต
      • ๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Œ
      • Memoization ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์•ˆํ•จ