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

Daehyunii's Dev-blog

11 ํ€ต ์ •๋ ฌ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/Algorithm & Data structure

11 ํ€ต ์ •๋ ฌ

Daehyunii 2022. 8. 8. 00:24

11.1 ํ€ต ์ •๋ ฌ ์†Œ๊ฐœ

  ํ€ต ์ •๋ ฌ์€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ์ •๋ ฌ ๋ฐฉ์‹์ด๋‹ค. ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜๊ธฐ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์šฐ์„  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ 0๊ฐœ ๋˜๋Š” 1๊ฐœ์˜ ํ•ญ๋ชฉ์ด ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ถ„ํ• ํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ”ผ๋ฒ—๊ฐœ๋…์„ ํ†ตํ•ด ์ •๋ ฌ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ ๋น„๊ตํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค๋ฉด ์ด๋ฏธ ์ •๋ ฌ์ด ๋œ ๊ฒƒ์ด๋‹ค. ํ€ต ์ •๋ ฌ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์€ ํ”ผ๋ฒ—์ด๋‹ค. ํ€ต ์ •๋ ฌ์€ ํ”ผ๋ฒ— ํฌ์ธํŠธ๋ผ ๋ถˆ๋ฆฌ๋Š” ๋‹จ์ผ ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  ์˜ˆ๋ฅผ ๋“ค์–ด ํ”ผ๋ฒ— ํฌ์ธํŠธ๋ฅผ ๊ฐ€์šด๋ฐ ์žˆ๋Š” ์š”์†Œ๋กœ ์ •ํ–ˆ๋‹ค๋ฉด ํ•  ์ผ์€ ํ•ด๋‹น ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ํ”ผ๋ฒ— ํฌ์ธํŠธ๋ณด๋‹ค ํฐ ์ˆซ์ž๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ํ”ผ๋ฒ— ์ˆซ์ž ํ•˜๋‚˜๋งŒํผ์€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์ •๋ ฌ์ด ๋œ๋‹ค. ์ค‘์š”ํ•œ๊ฒƒ์€ ๊ทธ ํ”ผ๋ฒ— ํฌ์ธํŠธ ์ˆซ์ž ํ•˜๋‚˜๋งŒ ์˜ณ๋ฐ”๋ฅธ ์œ„์น˜์— ์ •๋ ฌ๋œ ๊ฒƒ์ด๋‹ค. ํ”ผ๋ฒ— ํฌ์ธํŠธ์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ์š”์†Œ๋“ค์˜ ์ •๋ ฌ์ƒํƒœ๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ํ™•์‹คํ•œ๊ฑด ํ”ผ๋ฒ— ํฌ์ธํŠธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์š”์†Œ ๋งŒํผ์€ ์ •ํ™•ํ•œ ์œ„์น˜์— ์ •๋ ฌ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ด ํ€ต ์ •๋ ฌ์ด๋‹ค.

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

์˜์‚ฌ์ฝ”๋“œ
1. ํ”ผ๋ฒ— ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด, ์‹œ์ž‘์ธ๋ฑ์Šค, ๋์ธ๋ฑ์Šค ์ฆ‰ ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค.
2. ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‹œ์ž‘์ธ๋ฑ์Šค๋Š” 0, ๋์ธ๋ฑ์Šค๋Š” ๋ฐฐ์—ด๊ธธ์ด-1 ์ด๋‹ค.
3. ๊ทธ ๋‹ค์Œ ๋ฐฐ์—ด ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ํ”ผ๋ฒ—์„ ์„ ํƒํ•œ๋‹ค.(๋ฌด์ž‘์œ„ ์„ ํƒ์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.)
4. ํ˜„์žฌ์˜ ํ”ผ๋ฒ— ์ธ๋ฑ์Šค๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
5. ๊ทธ ํ›„ ๋’ค์˜ ์š”์†Œ๋“ค์„ ๋น„๊ตํ•˜์—ฌ ํ”ผ๋ฒ—์˜ ๋ฐ”๋€” ์œ„์น˜๋ฅผ ๊ณ„์†ํ•ด์„œ ํ™•์ธํ•œ๋‹ค.
6. ํ™•์ธ์„ ์œ„ํ•ด ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋Œ์•„๊ฐ€๋Š” ๋ฃจํ”„๋ฅผ ๋งŒ๋“ ๋‹ค.
7. ์‚ดํŽด๋ณด๋Š” ์š”์†Œ๋ณด๋‹ค ํ”ผ๋ฒ—์ด ํด ๊ฒฝ์šฐ ํ”ผ๋ฒ— ์ธ๋ฑ์Šค ๋ณ€์ˆ˜์— +1์„ ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ํ˜„์žฌ ์‚ดํŽด๋ณด๋Š” ์š”์†Œ์™€ ๋น„๋ฒ— ์ธ๋ฑ์Šค์˜ ์š”์†Œ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
8. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” ์ฒ˜์Œ ์‹œ์ž‘ํ–ˆ๋˜ ํ”ผ๋ฒ— ์ธ๋ฑ์Šค์™€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ฆ๊ฐ€๋œ ํ”ผ๋ฒ— ์ธ๋ฑ์Šค๋ฅผ ์Šค์™‘ํ•œ ํ›„ ํ”ผ๋ฒ— ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

function pivotHelper(arr, start = 0, end = arr.length -1){
    function swap(arr, i, j){
        temp = arr[i];
        arr[j] = arr[i];
        arr[i] = arr[j];
    }

    let pivot = arr[start];
    let pivotIndex = start;

    for(let i = start+1 ; i < arr.length ; i++){
        if(pivot > arr[i]){
            pivotIndex++;
            swap(arr,pivotIndex,i);
        }
    }
    swap(arr,start,pivotIndex);
    return pivotIndex;
}

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

function pivotHelper(arr, start = 0, end = arr.length -1){
    function swap(arr, i, j){
        temp = arr[i];
        arr[j] = arr[i];
        arr[i] = arr[j];
    }

    let pivot = arr[start];
    let pivotIndex = start;

    for(let i = start+1 ; i < arr.length ; i++){
        if(pivot > arr[i]){
            pivotIndex++;
            swap(arr,pivotIndex,i);
        }
    }
    swap(arr,start,pivotIndex);
    return pivotIndex;
}






function quickSort(arr, left = 0, right = arr.length -1){
    if(left < right){ // ํ•˜์œ„ ๋ฐฐ์—ด์ด ํ•˜๋‚˜์˜ ์š”์†Œ ๊ธธ์ด์— ๋„๋‹ฌํ–‡์„ ๋•Œ ๋ฉˆ์ถ”๋Š”๊ฒƒ์ž„
        //ํ•˜๋‚˜ ๋‚จ์€ ์š”์†Œ๋Š” ์ •๋ ฌ์ด ๋œ ์ƒํƒœ์ด๋‹ˆ๊นŒ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ทธ ์ „์ฒด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋จ
        let pivotIndex = pivotHelper(arr, left, right) //3
        //ํ”ผ๋ฒ—๊ธฐ์ค€ ์™ผ์ชฝ ์š”์†Œ๋“ค(ํ”ผ๋ฒ—์€ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ๋‹ˆ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Œ)
        quickSort(arr,left,pivotIndex-1);
        //ํ”ผ๋ฒ—๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋“ค(ํ”ผ๋ฒ—์€ ์ •๋ ฌ์ด ๋œ ์ƒํƒœ๋‹ˆ ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Œ)
        quickSort(arr,pivotIndex+1,right);
      }
     return arr;
}

  ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ผญ ์ธ์ง€ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š”๊ฒƒ์ด๋‹ค!! ๊ณ„์†ํ•ด์„œ arr๋ฐฐ์—ด์ด ์กฐ๊ธˆ์”ฉ ๋ฐ”๋€Œ๋Š” ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค!! ์ฆ‰ ์‰ฝ๊ฒŒ ๋งํ•ด ํ”ผ๋ฒ— ๊ธฐ์ค€ ์™ผ์ชฝ ์š”์†Œ๋“ค์ด quickSort์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•˜๋‚˜์˜ ์š”์†Œ ๊ธธ์ด์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ •๋ ฌ๋˜๊ณ , ๊ทธ ํ›„ ํ”ผ๋ฒ— ๊ธฐ์ค€ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋“ค๋„ ์™ผ์ชฝ ์š”์†Œ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์žฌ๊ท€์˜ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ์กฐ๊ธˆ์”ฉ ์ •๋ ฌ๋˜๋ฉด์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ •๋ ฌ์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์— ๋ชจ๋‘ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ •๋ง ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ•์กฐํ•˜์ง€๋งŒ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์•ˆ๋˜๋Š”๊ฒƒ์ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๋ฐฐ์—ด์„ ํ”ผ๋ฒ—๊ณผ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๊ณ„์†ํ•ด์„œ ๋ณ€ํ™”์‹œ์ผœ ์ •๋ ฌ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค!!!(์ด ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ์—ˆ๋‹ค.)

  ํ€ต ์ •๋ ฌ์—์„œ ํ•˜๋‚˜ ์•Œ์•„์•ผํ•  ํŠน์ง•์ด ์žˆ๋‹ค๋ฉด ํ€ต ์ •๋ ฌ์€ ์ผ๋ฐ˜์ ์œผ๋กœ O(nlog n)์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” O(n^2) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๋ฐฐ์—ด์ด ๋ชจ๋‘ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.(์ฒซ ๋ฒˆ์งธ ์œ„์น˜ํ•œ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ„ํ•ดํ•˜๋ฉด์„œ ๋ชจ๋“  ์š”์†Œ๋“ค์ด ํ•œ ๋ฒˆ์”ฉ ํ”ผ๋ฒ—์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.) ๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์— ์œ„์น˜ํ•ด์•ผ ํ•  ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ๊ทธ๋ ‡๊ฒŒ ์„ ํƒํ•˜๋Š”๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ์™„์ „ํžˆ ์œ„ํ—˜์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜๋Š” ์—†๋‹ค.