1. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : DFS / BFS
- ํƒ์ƒ‰(Search)์€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •
- DFS์™€ BFS๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

์ถœ์ฒ˜ :์—”์ง€๋‹ˆ์–ด๋Œ€ํ•œ๋ฏผ๊ตญ / [์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜] Graph ๊ฒ€์ƒ‰ DFS, BFS ๊ตฌํ˜„ in Java



2. DFS(Depth-First Search, ๊นŠ์ด์šฐ์„  ํƒ์ƒ‰)
- ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
- Stack ์ž๋ฃŒ๊ตฌ์กฐ(ํ›„์ž…์„ ์ถœ๋ฐฉ์‹) ํ˜น์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉ

2-1. DFS ๋™์ž‘๊ณผ์ •
โ‘  ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
โ‘ก ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๊ทธ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค
โ‘ข ๋” ์ด์ƒ ์œ„ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 



3. BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)
- ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
- Queue์ž๋ฃŒ๊ตฌ์กฐ(์„ ์ž…์„ ์ถœ๋ฐฉ์‹)๋ฅผ ์ด์šฉ

3-1. BFS ๋™์ž‘๊ณผ์ •
โ‘  ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
โ‘ก ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ ๋’ค์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ์ค‘์—๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
โ‘ข ๋” ์ด์ƒ ์œ„ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

 

๋”๋ณด๊ธฐ

1. ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜(greedy algorithm)

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

 

2. ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•œ๊ณ„

์ตœ์ ์˜ ํ•ด์— ๊ฐ€๊นŒ์šด ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทผ์‚ฌ์น˜ ์ถ”์ •์— ํ™œ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด '์‹œ์ž‘' ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ์•„ leaf node ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ

  • Greedy ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ์‹œ ์‹œ์ž‘ -> 7 -> 12 ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ 7 + 12 = 19 ๊ฐ€ ๋จ
  • ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ ์‹œ์ž‘ -> 10 -> 5 ์ด๋ฉฐ, 10 + 5 = 15 ๊ฐ€ ๋‹ต

 

๋”๋ณด๊ธฐ

1. ์ˆœ์—ด Permutation

  • ๊ธธ์ด๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์—์„œ r๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฝ‘์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐฐ์—ด(์ค‘๋ณต์ œ์™ธ)
    → ์ˆœ์—ด, ์ค‘๋ณต ์ˆœ์—ด, ์กฐํ•ฉ, ์ค‘๋ณต์กฐํ•ฉ ๋ชจ๋‘ n๊ฐœ์—์„œ r๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋‹ค๋Š” ์ ์—์„œ ๋™์ผ
  • ์ˆœ์—ด์˜ ์ •์˜์—์„œ๋Š” ์ •๋ ฌ.  ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•
public class AlgorithmStudy {
    public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){
        if(depth == r){
            for(int num: out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=0; i<arr.length; i++){
            if(!visited[i]){
                visited[i] = true;
                out[depth] = arr[i];
                permutation(arr, out, visited, depth+1, r);
                visited[i] = false;
            }
        }
    }

    public static void main(String[] args){
        int[] arr = {1, 2, 3};
        int r = 2;
        permutation(arr, new int[r], new boolean[arr.length], 0, r);
    }
}

→ ๊ฒฐ๊ณผ :  1 2 / 1 3 / 2 1 / 2 3 / 3 1 / 3 2

 

2. ์ค‘๋ณต ์ˆœ์—ด

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ r๊ฐœ๋ฅผ ๋ฝ‘์•„์„œ ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
  • ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ˆœ์—ด๊ณผ ๋™์ผ. ๊ฐ™์€ ์›์†Œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด
    → ์ˆœ์—ด ์ฝ”๋“œ์—์„œ ์ค‘๋ณต๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ visited ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.
public class AlgorithmStudy {
    public static void permutation(int[] arr, int[] out, int depth, int r){
        if(depth == r){
            for(int num: out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=0; i<arr.length; i++){
            out[depth] = arr[i];
            permutation(arr, out, depth+1, r);
        }
    }

    public static void main(String[] args){
        int[] arr = {1, 2, 3};
        int r = 2;
        permutation(arr, new int[r], 0, r);
    }
}

→ ๊ฒฐ๊ณผ :  1 1 / 1 2 / 1 3 /  2 1 / 2 2 / 2 3 / 3 1 / 3 2 / 3 3


 

3. ์กฐํ•ฉ Combination

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ˆœ์„œ ์—†์ด r๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜(์ค‘๋ณต์ œ์™ธ)
    →[1, 2] ์™€ [2, 1]์„ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ โ–ท ์ด ๊ฒฝ์šฐ [1, 2]๋งŒ ์นด์šดํŒ…
  • ์ˆœ์„œ ์ƒ๊ด€์ด ์—†๊ณ , ์ค‘๋ณต๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋œ ์›์†Œ๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , 
    ์›์†Œ๋“ค๊ณผ visited๋งŒ ์ด์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธํ•œ ์›์†Œ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜๋ฉด ๊ณง ์„ ํƒ๋œ ์กฐํ•ฉ
public class AlgorithmStudy {
    public static void combination(int[] arr, boolean[] visited, int start, int depth, int r){
        if(depth == r){
            for(int i=0; i<arr.length; i++){
                if(visited[i]) System.out.print(arr[i]);
            }
            System.out.println();
            return;
        }
        for(int i=start; i<arr.length; i++){
            if(!visited[i]){
                visited[i] = true;
                combination(arr, visited, i+1, depth+1, r);
                visited[i] = false;
            }
        }
    }

    public static void main(String[] args){
        int[] arr = {1, 2, 3};
        int r = 2;
        combination(arr, new boolean[arr.length], 0, 0, r);
    }
}

→ ๊ฒฐ๊ณผ : 1 2 / 1 3 / 2 3

 

4. ์ค‘๋ณต ์กฐํ•ฉ

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ˆœ์„œ ์—†์ด, ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ r๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
  • ์ˆœ์„œ ์—†์ด ๋ฝ‘๋Š” ์กฐํ•ฉ๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด(์ฆ‰, ์ด๋ฏธ ๋ฝ‘์€ ๊ฒƒ์„ ๋˜ ๋ฝ‘์„ ์ˆ˜ ์žˆ์Œ)
    → ์กฐํ•ฉ ์ฝ”๋“œ์—์„œ ์ค‘๋ณต๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์‚ฌ์šฉํ–ˆ๋˜ visited ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.
    → ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์„ ํƒํ•œ ์›์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด ํ•„์š”
public class AlgorithmStudy {
    public static void combination(int[] arr, int[] out, int start, int depth, int r){
        if(depth == r){
            for(int num : out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=start; i<arr.length; i++){
            out[depth] = arr[i];
            combination(arr, out, i, depth+1, r);
        }
    }

    public static void main(String[] args){
        int[] arr = {1, 2, 3};
        int r = 2;
        combination(arr, new int[r], 0, 0, r);
    }
}

๊ฒฐ๊ณผ → 1 1 / 1 2 / 1 3 / 2 2 / 2 3 / 3 3

 

 

๋”๋ณด๊ธฐ

1. ํˆฌํฌ์ธํ„ฐ(Two Pointers)

  • ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ ๋‘ ํฌ์ธํ„ฐ ๊ตฌ๊ฐ„์˜ ๊ฐ’์ด 
    ํƒ€๊ฒŸ ๊ฐ’๊ณผ ๊ฐ™์„ ๋•Œ๊นŒ์ง€ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
    → ๋ณดํ†ต l(left), r(right) ๋˜๋Š” s(start), e(end) ๊ฐ™์€ ์‹์œผ๋กœ ํฌ์ธํ„ฐ์˜ ์ด๋ฆ„์„ ๋ถ™์ž„.
  • ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๋‘ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์ง‘ํ•ฉ์—๋„ ์‚ฌ์šฉ
  • ํ•ฉ๋ณ‘์ •๋ ฌ์˜ counquer ์˜์—ญ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๊ธฐ๋„ ํ•จ
  • ์‹œ๊ฐ„ ๋‹จ์ถ•

 

1-1. ํฌ์ธํ„ฐ ๋ฐฉ์‹

  • ๋งจ ์ฒ˜์Œ ๋‘ ํฌ์ธํ„ฐ๋Š” 0์—์„œ ์‹œ์ž‘, start <= end ๋ฅผ ๋งŒ์กฑํ•ด์•ผํ•จ.
  • ๋ถ€๋ถ„ํ•ฉ ๋ฐฐ์—ด์˜ ํ•ฉ < ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฐ’
    → end๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜์—ฌ ๋ถ€๋ถ„ํ•ฉ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด
  • ๋ถ€๋ถ„ํ•ฉ ๋ฐฐ์—ด์˜ ํ•ฉ >= ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฐ’
    → start๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜์—ฌ ๋ถ€๋ถ„ํ•ฉ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ์†Œ์‹œํ‚ด
  • ์œ„ ๊ณผ์ •์„ start ์ธํ…์Šค๊ฐ€ (๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ-1)์ด ๋ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

 

2. ํˆฌํฌ์ธํ„ฐ ์˜ˆ์ œ ๋ฐ ํ’€์ด(๋ฐฑ์ค€ 2003๋ฒˆ : ์ˆ˜๋“ค์˜ ํ•ฉ2)

 

public class Main {
 
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2}; // ํฌ๊ธฐ๊ฐ€ 10์ธ 1์ฐจ์› ๋ฐฐ์—ด 
        int m = 5; // ์—ฐ์†๋œ ๊ตฌ๊ฐ„์˜ ํ•ฉ์ด 5์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
        
        int count = twoPointers(arr, m);
    }
    
    private static int twoPointers(int[] arr, int m) {
        int sum = 0, count = 0;
        int left = 0, right = 0;
        
        while (true) {
            if (sum > m) { // 1. left๋ฅผ ์šฐ์ธก์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒฝ์šฐ 
                sum -= arr[left++];
            } else if (right == arr.length - 1) { 
			// right๋ฅผ ์šฐ์ธก์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์ „์— ๋ฐฐ์—ด์˜ ๋์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
                break;
            } else { // 2. right๋ฅผ ์šฐ์ธก์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒฝ์šฐ 
                sum += arr[right++];
            }
            
            if (sum == m) count++;
        }
        
        return count;
    }
}

 

 

 

 

 

๋”๋ณด๊ธฐ

์ฐธ๊ณ ) https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Algorithm/%ED%88%AC%ED%8F%AC%EC%9D%B8%ED%84%B0%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.md

 

GitHub - WooVictory/Ready-For-Tech-Interview: ๐Ÿ’ป ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ค€๋น„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์‹์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„

๐Ÿ’ป ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ค€๋น„๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์‹์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„ ๐Ÿ‘จ‍๐Ÿ’ป. Contribute to WooVictory/Ready-For-Tech-Interview development by creating an account on GitHub.

github.com

 

์ฐธ๊ณ ) https://ssungkang.tistory.com/entry/Algorithm-Two-Pointers-%ED%88%AC-%ED%8F%AC%EC%9D%B8%ED%84%B0

 

[Algorithm] Two Pointers, ํˆฌ ํฌ์ธํ„ฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Two Pointers์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Two Pointers ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

ssungkang.tistory.com

 

์ฐธ๊ณ ) https://www.lifencoding.com/algorithm/13?p=1 

 

[Algorithms] ํˆฌ ํฌ์ธํ„ฐ(Two Pointers) ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํฌ์ธํ„ฐ๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ์™€ ๊ฐ™์ด ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํˆฌ ํฌ์ธํ„ฐ๋Š” ์‹œ์ž‘๊ณผ ๋ ๋˜๋Š” ์™ผ์ชฝ๊ณผ

www.lifencoding.com

 

์ฐธ๊ณ ) https://www.acmicpc.net/problem/2003

 

2003๋ฒˆ: ์ˆ˜๋“ค์˜ ํ•ฉ 2

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„์—๋Š” A[1], A[2], …, A[N]์ด ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ A[x]๋Š” 30,000์„ ๋„˜์ง€ ์•Š๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

 

1. ํ€ต์ •๋ ฌ(Quick Sort) ์•Œ๊ณ ๋ฆฌ์ฆ˜

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

1-1. ํ€ต์ •๋ ฌ์˜ ํ”ผ๋ด‡ ์„ ์ •๋ฐฉ๋ฒ•

  • โ‘  ๋žœ๋คํ•˜๊ฒŒ ์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • โ‘ก 3๊ฐœ์˜ ์ˆซ์ž์˜ ์ค‘์•™ ๊ฐ’์œผ๋กœ ์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
    → ๊ฐ€์žฅ ์™ผ์ชฝ ์ˆซ์ž / ์ค‘๊ฐ„์ˆซ์ž / ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์ˆซ์ž ์ค‘์—์„œ ์ค‘์•™๊ฐ’์œผ๋กœ ํ”ผ๋ด‡์„ ์ •ํ•จ
  • โ‘ข Median-of-Medians
    → ๋ฐฐ์—ด์„ 3๋“ฑ๋ถ„ ํ›„, ๊ฐ ๋ถ€๋ถ„์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ ์ˆซ์ž / ์ค‘๊ฐ„ ์ˆซ์ž / ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ˆซ์ž ์ค‘์—์„œ ์ค‘์•™๊ฐ’์„ ์ฐพ์€ ํ›„,
         ์„ธ ์ค‘์•™๊ฐ’๋“ค ์ค‘์—์„œ ์ค‘์•™๊ฐ’์œผ๋กœ ํ”ผ๋ด‡์„ ์ •ํ•จ

โ‘ข Median-of-Medians

 

 

 

2. ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„

# include <stdio.h>
# define LEN 7
 
void quickSort(int arr[], int L, int R) {
      int left = L, right = R;
      int pivot = arr[(L + R) / 2];    // pivot ์„ค์ • (๊ฐ€์šด๋ฐ) 
      int temp;
      do
      {
        while (arr[left] < pivot)    // left๊ฐ€ pivot๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ pivot์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ 
            left++;
        while (arr[right] > pivot)    // right๊ฐ€ pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ pivot์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ 
            right--;
        if (left<= right)    // left๊ฐ€ right๋ณด๋‹ค ์™ผ์ชฝ์— ์žˆ๋‹ค๋ฉด ๊ตํ™˜ 
        {
            temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            /*left ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์นธ, right ์™ผ์ชฝ์œผ๋กœ ํ•œ์นธ ์ด๋™*/
            left++;
            right--;
        }
      } while (left<= right);    // left๊ฐ€ right ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
 
    /* recursion */
    if (L < right)
        quickSort(arr, L, right);    // ์™ผ์ชฝ ๋ฐฐ์—ด ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณต 
 
    if (left < R)
        quickSort(arr, left, R);    // ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณต 
}
 
int main(){
  int i;
  int arr[LEN] = {5,1,6,3,4,2,7};
  printf("์ •๋ ฌ ์ „ : ");
  for(i=0; i<LEN; i++){
    printf("%d ", arr[i]);
  }
  printf("\n");
    
  quickSort(arr, 0, LEN-1);
  
  printf("์ •๋ ฌ ํ›„ : ");
  for(i=0; i<LEN; i++){
    printf("%d ", arr[i]);
  }
  
  return 0; 
}

 

 

3. ํ€ต์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํŠน์ง•

3-1. ์žฅ์ 

  • ์ปค๋‹ค๋ž€ ํฌ๊ธฐ์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ ๊ฐ€์žฅ ์ข‹์€ ์„ฑ๋Šฅ
  • ์ •๋ ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฐ์—ด ์•ˆ์—์„œ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Œ

3-2. ๋‹จ์ 

  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ์ด๋‹ค.
  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋Š” ํ€ต์ •๋ ฌ์˜ ๋ถˆ๊ท ํ˜• ๋ถ„ํ• ์— ์˜ํ•ด ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์˜คํžˆ๋ ค ๋” ๋งŽ์ด ๊ฑธ๋ฆผ

 

 

๋”๋ณด๊ธฐ

์ฐธ๊ณ ) https://bblackscene21.tistory.com/9

 

[ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ ] ํ€ต์ •๋ ฌ ํ€ต์†ŒํŠธ(Quick Sort) - ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜(feat. python ํŒŒ์ด์ฌ)

ํ€ต ์ •๋ ฌ์ด๋ž€? ํ€ต ์ •๋ ฌ๋„ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ๋ณ‘ ์ •๋ ฌ(Merge Sort) ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•  ๋•Œ, ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ํ•ญ์ƒ ๊ฐ™์•˜์ง€๋งŒ, ํ€ต ์ •๋ ฌ์€ ์ผ์ •ํ•˜์ง€ ์•Š

bblackscene21.tistory.com

์ฐธ๊ณ ) https://gyoogle.dev/blog/algorithm/Quick%20Sort.html

 

ํ€ต ์ •๋ ฌ(Quick Sort) | ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป Tech Interview

ํ€ต ์ •๋ ฌ(Quick Sort) Goal Quick Sort์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. Quick Sort ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. Quick Sort์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. Quick Sort์˜ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. Quick Sort์˜ ์ตœ์•…์ธ

gyoogle.dev

+ Recent posts