CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํˆฌํฌ์ธํ„ฐ

์ฝ”๋”999 2023. 1. 16. 11:34

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