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

Daehyunii's Dev-blog

04 ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด ๋ณธ๋ฌธ

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

04 ๋ฌธ์ œ ํ•ด๊ฒฐ ํŒจํ„ด

Daehyunii 2022. 8. 4. 00:22

4.1 ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด๋“ค

  ๋ฌธ์ œ ํ•ด๊ฒฐ ์ ‘๊ทผ๋ฒ•์— ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์œผ๋กœ ์ด์ œ๋Š” ๋•Œ๋•Œ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์‚ดํŽด๋ณด๋ ค ํ•œ๋‹ค. ๊ต‰์žฅํžˆ ๋งŽ์€ ํŒจํ„ด๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด๋“ค๋งŒ ์‚ดํŽด๋ณด์ž.(๊ณต์‹์ ์ธ ์ด๋ฆ„์ด ๋ถ™์€ ํŒจํ„ด๋“ค๋„ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์€ ํŒจํ„ด๋“ค๋„ ์กด์žฌํ•œ๋‹ค.)

 

1. Frequency Counter ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด (๊ฐ•์‚ฌ๋‹˜์ด ์ง์ ‘ ๋ถ™์ธ ์ด๋ฆ„์ด๋‹ค)

2. Multiple Pointers ๋‹ค์ค‘ ํฌ์ธํ„ฐ ํŒจํ„ด (๊ฐ•์‚ฌ๋‹˜์ด ์ง์ ‘ ๋ถ™์ธ ์ด๋ฆ„์ด๋‹ค)

3. Sliding Window ๊ธฐ์ค€์  ๊ฐ„ ์ด๋™ ๋ฐฐ์—ด ํŒจํ„ด

4. Divide and Conquer ๋ถ„ํ• ๊ณผ ์ •๋ณต ํŒจํ„ด (๊ณต์‹์ ์ธ ์ด๋ฆ„์ด๋‹ค. ์‹ค์ œ ์ž์ฃผ ์‚ฌ์šฉ๋จ)

5. Greedy Algorithms ํƒ์š• ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจํ„ด (์‹ค์ œ ์ž์ฃผ ์‚ฌ์šฉ๋จ)

 

  ์ด ์ฒ˜๋Ÿผ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด๋“ค์ด ๋งŽ์ด ์กด์žฌํ•œ๋‹ค.

 

4.2 Frequency Counter ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด (๊ณต์‹์ ์ธ ์ด๋ฆ„์€ ์—†๋‹ค)

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

 

  ์˜ˆ๋ฅผ๋“ค์–ด, '2๊ฐœ์˜ ๋ฐฐ์—ด์„ ํ—ˆ์šฉํ•˜๋Š” arrayCompare ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค'๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์ด ํ•จ์ˆ˜๋Š” ์ฒ˜์Œ์œผ๋กœ ์ž…๋ ฅ๋ฐ›์€ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์˜ ์ œ๊ณฑ์ด ๋‘ ๋ฒˆ์งธ๋กœ ์ž…๋ ฅ๋ฐ›์€ ๋ฐฐ์—ด์— ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋‹ค. ์ˆœ์„œ๋Š” ์ƒ๊ด€์—†์ง€๋งŒ ๋‘ ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋Š” ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

ex) [1, 2, 3] [1, 4, 9] -> true

 

  ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž‘์„ฑํ•ด๋ณด์ž

function arrayCompare(array1, array2){
    if(array1.length !== array2.length){
        return false;
    }
    for(let i = 0; i < array1.length; i++){ //์˜ค์—”
        let correctInd = array2.indexOf(array1[i] ** 2) //์ธ๋ฑ์Šค์˜ค๋ธŒ๊ฐ€ ์˜ค์—”์ž„
        if(correctInd === -1) {
            return false;
        }
    console.log(array2);
    array2.splice(correctInd,1)
    }
    return true;
}//์˜ค์—”์ œ๊ณฑ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–์Œ

console.log(arrayCompare([1,2,3,2], [9,1,4,4]))

  ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด O(N^2) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž‘์„ฑ๋œ๋‹ค. ์ด๋ฒˆ์—๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•ด ๋ณด์ž.

function arrayCompare(array1, array2){
    if(array1.length !== array2.length){
        return false;
    }
    let freCounter1 = {}
    let freCounter2 = {}
    for(let foo of array1){
        freCounter1[foo] = (freCounter1[foo] || 0) + 1
    }
    for(let foo of array2){
        freCounter2[foo] = (freCounter2[foo] || 0) + 1        
    }
    console.log(freCounter1);
    console.log(freCounter2);
    for(let bar in freCounter1){
        if(!(bar ** 2 in freCounter2)){
            return false
        }
        if(freCounter2[bar ** 2] !== freCounter1[bar]){
            return false
        }
    }
    return true
}

arrayCompare([1,2,3,2,5], [9,1,4,4,11])

  O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ๋ฉด์—์„œ๋„ ๋›ฐ์–ด๋‚œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.(์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ๊ฐ•์˜์—์„œ ๋ฐฐ์› ์ง€๋งŒ, ๋„ˆ๋ฌด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•œ๊ฑด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์˜๊ตฌ์‹ฌ์€ ๋“ ๋‹ค..)

 

4.3 ์•„๋‚˜๊ทธ๋žจ 

  ์•„๋‚˜๊ทธ๋žจ์ด๋ž€ ์ผ์ข…์˜ ๋ง์žฅ๋‚œ์œผ๋กœ ์–ด๋– ํ•œ ๋‹จ์–ด์˜ ๋ฌธ์ž๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜์—ฌ ๋‹ค๋ฅธ ๋œป์„ ๊ฐ€์ง€๋Š” ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ฆ‰, 'apple'์„'elpap'์ฒ˜๋Ÿผ ๋ฌผ๋ก  ๋ง์€ ๋˜์ง€๋งŒ ๊ฐ™์€ ๋ฌธ์ž๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅธ๊ฒƒ์„ ์•„๋‚˜๊ทธ๋žจ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ’€์–ด์•ผ ํ•  ๋ฌธ์ œ๋Š” ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‘ ๋ฌธ์ž์—ด์ด ์„œ๋กœ์˜ ์•„๋‚˜๊ทธ๋žจ์ด๋ฉด ์ฐธ์„ ์•„๋‚˜๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ฑฐ์ง“์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค. ์ด๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ฌธ์ž์—ด ์„ธ๊ธฐ ํŒจํ„ด์ด๋‹ค. ํŒจํ„ด์„ ์ด์šฉํ•ด์„œ ์•„๋‚˜๊ทธ๋žจ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

function anagram(string1,string2){
    if(string1.length !== string2.length){
        return false;
    }
    let strObject1 = {};
    let strObject2 = {};
    for(let i of string1){
        strObject1[i] = (strObject1[i] || 0) + 1; // ๊ฐ์ฒด์•ˆ์— ์ ‘๊ทผ ํ•  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์œผ๋ฉด, undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ falsy๊ฐ€ ๋˜๊ณ  false๊ฐ’์œผ๋กœ ์•”๋ฌต์  ํƒ€์ž… ๋ณ€ํ™˜๋˜์–ด ๋’ค์˜ ๊ฐ’์ด ๋ฐ˜ํ™˜๋จ
    }
    for(let i of string2){
        strObject2[i] = (strObject2[i] || 0) + 1;
    }
    for(let i in strObject1){
        if(!(i in strObject2)){
            return false;
        }
        if(strObject2[i] !== strObject1[i]){
            return false;
        }
    }
    return true;
}

console.log(anagram("cat","bus")); // false

 ์ฆ‰, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด์ด๋‚˜ ๋ฐฐ์—ด์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’๋“ค์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์นด์šดํŠธํ•˜์—ฌ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ณ  ๋น„๊ตํ•˜๋Š”๊ฒŒ ๋นˆ๋„ ์ˆ˜ ์„ธ๊ธฐ ํŒจํ„ด์ด๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ์ ์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ค‘์ฒฉ๋˜์ง€ ์•Š์€ ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

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

 

4.4 ๋‹ค์ค‘ ํฌ์ธํ„ฐ ํŒจํ„ด (๊ณต์‹์ ์ธ ์ด๋ฆ„์ด ์—†๋Š” ํŒจํ„ด์ด๋‹ค)

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

 

  ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ sumZero ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ํ•จ์ˆ˜๋Š” ํ•ฉ๊ณ„๊ฐ€ 0์ธ ์ฒซ ๋ฒˆ์งธ ์Œ ์ฆ‰, ํ•œ ์ˆซ์ž๋ฅผ ๊ฐ€์ ธ์™€ ๋‹ค๋ฅธ ์ˆซ์ž์— ๋”ํ•˜๋ฉด 0์ด ๋˜๋Š” ํ•œ ์Œ์„ ์ฐพ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ex)

[-3, -2, -1, 0, 1, 2, 3] -> [-3, 3]์„ ๋ฐ˜ํ™˜ํ•จ

[-2, 0, 1, 3] -> undefined๋ฅผ ๋ฐ˜ํ™˜ํ•จ(ํ•ฉ์ด 0์ธ ์Œ์ด ์—†์œผ๋ฏ€๋กœ)

 

  ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์ž.

function sumZero(array){
    for(let i = 0; i < array.length; i++){
        for(let j = i+1 ; j < array.length; j++){
            if(array[i] + array[j] === 0){
                return [array[i], array[j]];
            }
        }
    }
}
 

  ์œ„ ์ฝ”๋“œ๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜์—ฌ O(N^2)์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋‹ค ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค.

 

  ๋‹ค์ค‘ ํฌ์ธํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์ž.

function sumZero(array){
    let left = 0;
    let right = array.length - 1;
    while(left < right){
        let sum = array[left] + array[right];
        if(sum === 0){
            return [array[left], array[right]];
        } else if(sum > 0){
            right--;
        } else {
            left++;
        }
    }
}

  ์œ„์˜ ๋‹ค์ค‘ ํฌ์ธํ„ฐ ํŒจํ„ด์„ ์ด์šฉํ•˜๋ฉด O(N)์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‘ ๊ฐ’์˜ ํ•ฉ์ด ์˜๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ ์›€์ง€์ด๊ณ , ๋‘ ๊ฐ’์˜ ํ•ฉ์ด 0๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ ์•ž์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋‘ ์š”์†Œ์˜ ํ•ฉ์ด 0์ธ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

4.5 Sliding Window ํŒจํ„ด ๊ธฐ์ค€์  ๊ฐ„ ์ด๋™ ๋ฐฐ์—ด ํŒจํ„ด

  ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํŒจํ„ด์€ ๋‹จ์ผ ๋ณ€์ˆ˜, ํ•˜์œ„ ๋ฐฐ์—ด, ๋˜๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์œˆ๋„์šฐ(์ฐฝ๋ฌธ)์„ ์‹œ๋™์‹œํ‚ค๋ฉฐ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.(์‹œ์ž‘ ์œ„์น˜์—์„œ ์‹œ์ž‘ํ•˜๋ฉด ๋ณดํ†ต ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™, ๋ฐ˜๋Œ€๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค)

ex)๊ฐ€์žฅ ๊ธด ์‹œํ€€์Šค๋ฅผ ์ฐพ์•„๋ผ "hellomyworld" -> "hel/lomyw/orld" -> "lomyw"๊ฐ€ ๊ฐ€์žฅ ๊ธด ์‹œํ€€์‹œ์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์ ์šฉํ•˜๊ธฐ ์œ ์šฉํ•œ ํŒจํ„ด์ด ๋ฐ”๋กœ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํŒจํ„ด์ด๋‹ค.

 

์˜ˆ์ œ๋ฌธ์ œ) ๋ฐฐ์—ด์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ์‹œํ€€์Šค์˜ ํ•ฉ์€ ๋ฌด์—‡์ธ๊ฐ€?

  ex) maxSum([1, 2, 5, 2, 8, 1, 5], 2) -> 10์ด๋‹ค(2๊ฐœ์˜ ์—ฐ์†ํ•˜๋Š” ์š”์†Œ๋“ค ์ค‘ ๊ฐ€์žฅ ํ•ฉ์ด ํฐ ์š”์†Œ์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•จ)

ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

function maxSum(array, number) {
    if ( number > array.length){
        return null;
    }
    var max = -Infinity;
    for (let i = 0; i < array.length - number + 1; i ++){
        temp = 0;
        for (let j = 0; j < number; j++){
        temp += array[i + j];
        }
        if (temp > max) {
        max = temp;
        }
    }
    return max;
}

  O(N^2) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.(๋ฐ˜๋ณต๋ฌธ ์ค‘์ฒฉ ์‚ฌ์šฉ)

 ์ด๋ฒˆ์—๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž.

function maxSum(array, number){
    let max = 0;
    let temp = 0;
    if (array.length < number) return null;
    for (let i = 0; i < number; i++) {
        max += array[i];
    }
    temp = max;
    for (let i = number; i < array.length; i++) {
        temp = temp - array[i - number] + array[i];
        max = Math.max(max, temp);
    }
    return max;
}

  ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4.6 Divide and Conquer ๋ถ„ํ• ๊ณผ ์ •๋ณต (๊ณต์‹ํ™”๋œ ์ด๋ฆ„์ด๋‹ค)

  ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฃผ๋กœ ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด ๊ฐ™์€ ํฐ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฐ”๋กœ ์–ด๋–ค ํŒจํ„ด์ธ์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณด์ž.

์˜ˆ์ œ) indexSearch([1, 2, 3, 4, 5, 6], 4) // 3๋ฐ˜ํ™˜ (์š”์†Œ์ธ 4๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์Œ)

๋ถ„ํ• ๊ณผ ์ •๋ณต ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž.

function indexSearch(array, foo){
    for(let i = 0; i < array.length; i++){
        if(array[i] === foo){
            return i;
        }
    }
    return -1;
}
O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
function indexSearch(array, foo) {
 
    let min = 0;
    let max = array.length - 1;

    while (min <= max) {
        let mid = Math.floor((min + max) / 2);
        let currentEle = array[mid];

        if (array[mid] < foo) {
            min = mid + 1;
        }
        else if (array[mid] > foo) {
            max = mid - 1;
        }
        else {
            return mid;
        }
    }

    return -1;
}

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