πŸ“š 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λ₯Ό μ„ νƒν•˜κ³  ν•΄λ‹Ή 값을 μ°Ύμ•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ήκ°’μ˜ 인덱슀 번호λ₯Ό λ°˜ν™˜ν•œλ‹€. 즉, 큰 λ°°μ—΄μ΄λ‚˜ λ¬Έμžμ—΄μ—μ„œ νŠΉμ • μš”μ†Œλ‚˜ 문자λ₯Ό 찾을 λ•Œ ν•˜λ‚˜ ν•˜λ‚˜ λ‹€ λΉ„κ΅ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ 쀑간 지점을 μ°Ύμ•„ ν•„μš”μ—†λŠ” 뢀뢄은 λ¬΄μ‹œν•˜κ³  λΉ„κ΅ν•˜κ³ , 또 λ‚˜λ¨Έμ§€ ν•˜μœ„λ°°μ—΄ λ˜λŠ” λ¬Έμžμ—΄μ—μ„œ 쀑간 지점을 μ„ νƒν•΄μ„œ λΉ„κ΅ν•˜μ—¬ μ›ν•˜λŠ” μš”μ†Œ λ˜λŠ” λ¬Έμžμ—λ₯Ό μ°ΎλŠ” 방법이닀. ν•œ λ§ˆλ””λ‘œ 큰 데이터셋을 μ·¨ν•΄ μž‘μ€ ν•˜μœ„μ…‹μœΌλ‘œ λΆ„ν• ν•˜μ—¬ μ›ν•˜λŠ” 값을 μ°ΎλŠ” 것이닀.