😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[μ•Œκ³ λ¦¬μ¦˜ μœ„ν•œ ν•œλ°œμ§ λ‘λ°œμ§πŸΎ] 투 포인터 기법 λ³Έλ¬Έ

πŸ‘©‍πŸ’» 컴퓨터 ꡬ쑰/Algorithm

[μ•Œκ³ λ¦¬μ¦˜ μœ„ν•œ ν•œλ°œμ§ λ‘λ°œμ§πŸΎ] 투 포인터 기법

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 6. 26. 12:45
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” μ½”λ”©λ¬Έ codingmoon λ‹˜μ˜ 유튜브λ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

=> μ½”λ”©ν…ŒμŠ€νŠΈ ν•„μˆ˜ ν…Œν¬λ‹‰, νˆ¬ ν¬μΈν„° κΈ°λ²•

 

🫧 투 포인터 ν…Œν¬λ‹‰

: 1차원 λ°°μ—΄μ—μ„œ 각자 λ‹€λ₯Έ μ›μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 2개의 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ©ν‘œκ°’ κ΅¬ν•œλ‹€

: μ™„μ „ 탐색 O(n) μ†”λ£¨μ…˜ -> O(n) 으둜 μ„±λŠ₯ ν–₯상 κ°€λŠ₯

: μ—°μ†λœ κ΅¬κ°„μ˜ μ›μ†Œλ“€μ„ μ²˜λ¦¬ν•˜κΈ° μ›ν•˜κ±°λ‚˜, μ •λ ¬λœ λ°°μ—΄μ—μ„œ 무언가λ₯Ό ꡬ할 λ•Œ νˆ¬ν¬μΈν„° μ‚¬μš©

 

🐾 λ°°μ—΄μ—μ„œ, μ›μ†Œλ“€μ˜ 합이 x인 연속 λΆ€λΆ„ λ°°μ—΄μ˜ 개수λ₯Ό κ΅¬ν•˜λΌ

arr = [1, 3, 6, 5, 2, 7, 9], x = 9

result : {3, 6}, {2, 7}, {9}

// μ™„μ „ 탐색 O(n^2)
function cntSubArrSumOfX(arr, x) {
	let cnt = 0;
    for (let i = 0; i < arr.length; i ++) {
    	let sum = 0;
        for (let j = 0; j < arr.length; j++) {
        	sum += arr[j];
            if (sum > x) {
            	break;
            } else if (sum == x) {
            	cnt ++;
                break;
            }
        }
    }
    return cnt;
}
// 투 포인터 
function cntSubArrSumOfX(arr, x) {
	let cnt = 0;
    let sum = 0;
    let left = 0;
    let right = 0;
    
    while (right <= arr.length) {
    	if (sum === x) {
        	cnt ++
            sum -= arr[left]
            left ++
        } else if (sum < x) {
        	sum += arr[right]
            right ++
        } else if (sum > x) {
        	sum -= arr[left]
            left ++
        }
    }
    return cnt;
}

 

🐾 λ°°μ—΄μ—μ„œ, 두 개의 μ›μ†Œμ˜ 합이 x 와 같은지 ν™•μΈν•˜κ³  κ·Έλ ‡λ‹€λ©΄ 각각 μ›μ†Œμ˜ 인덱슀 λ°˜ν™˜ν•˜λΌ

arr = [2, 4, 5, 7, 11, 15], x = 15

result : [1, 4]

// μ™„μ „ 탐색 O(n^2)
function twoSumSorted(arr, x) {
	for (let i = 0; i < arr.legnth; i++) {
    	for (let j = 1; j < arr.length; j++) {
        	if (arr[i] * arr[j] === x && i != j) {
            	return [i, j]
            }
        }
    }
    return [-1, -1];
}
// 투 포인터 기법 
// μ–‘ μͺ½μ—μ„œμ˜ sum 이 x 보닀 크면 right --
// μ–‘ μͺ½μ—μ„œμ˜ sum 이 x 보닀 μž‘μœΌλ©΄ left ++

function twoSumSorted(arr, x) {
	let left = 0;
	let right = arr.length - 1
    
    while (left < right) {
    	let sum = arr[left] + arr[right]
        if (sum === x) {
        	return [left, right]
        } else if (sum < x) {
        	left ++
        } else if (sum > x) {
        	right --
        }
    }
	return [-1, -1];
}
728x90
λ°˜μ‘ν˜•
Comments