Algorithm

ํˆฌ ํฌ์ธํ„ฐ(Two pointer)์™€ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ(Sliding Window)

jeong_ii 2024. 7. 27. 01:54

๐Ÿ”น ํˆฌ ํฌ์ธํ„ฐ (Two pointer)

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

 

์œ„์— ์ ํžŒ ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ 2๊ฐ€์ง€ ์œ ํ˜•์„ ๊ฐ๊ฐ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

 

๐Ÿ”ธ 2๊ฐœ์˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์‹œ์ž‘์ ์ด ๋ฐฐ์—ด์˜ ์‹œ์ž‘์ ์ธ ๊ฒฝ์šฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฑ์ค€ 2003 ์ˆ˜๋“ค์˜ ํ•ฉ 2 ๋ฌธ์ œ์—์„œ๋Š” N๊ฐœ์˜ ์ˆ˜์—ด์—์„œ ํŠน์ • ๊ตฌ๊ฐ„(i๋ถ€ํ„ฐ j)์˜ ํ•ฉ์ด M์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค.

 

๋จผ์ €, ๋‘ ํฌ์ธํ„ฐ start์™€ end๋Š” ์‹œ์ž‘์  0์—์„œ ๊ฐ™์ด ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

 

end ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ์”ฉ ์›€์ง์—ฌ start์™€ end ์‚ฌ์ด์— ์žˆ๋Š” ์›์†Œ๋“ค์˜ ๊ตฌ๊ฐ„ํ•ฉ(sum)์„ ๊ตฌํ•ด์ค€๋‹ค.

 

 

sum์˜ ๊ฐ’์ด M๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ, sum์—์„œ ํ˜„์žฌ start ์œ„์น˜ ๊ฐ’์„ ๋นผ์ฃผ๊ณ  start ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ ์•ž์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

sum๊ณผ M์ด ๊ฐ™์€ ๊ฐ’์ผ ๋• cnt๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ค€๋‹ค.

 

end ํฌ์ธํ„ฐ๊ฐ€ N์— ๋„๋‹ฌํ•˜๋ฉด while๋ฌธ์„ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

๐Ÿ’ญ Java  Code

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2};
        int n = 10, m = 5;

        int start = 0, end = 0;
        int sum = 0, cnt = 0;
        while (true) {
            if (sum >= m) {
                sum -= arr[start++];
            } else if (end == n) break;
            else {
                sum += arr[end++];
            }

            if (sum == m) cnt++;
        }

        System.out.println(cnt);
    }
}

 

๐Ÿ”ธ 2๊ฐœ์˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ๊ฐ ์‹œ์ž‘์ ๊ณผ ๋์ ์— ์œ„์น˜ํ•œ ๊ฒฝ์šฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฑ์ค€ 2470 ๋‘ ์šฉ์•ก ๋ฌธ์ œ์—์„œ๋Š” ์–‘์˜ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด์ง„ ์‚ฐ์„ฑ ์šฉ์•ก๊ณผ ์Œ์˜ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด์ง„ ์•Œ์นผ๋ฆฌ์„ฑ ์šฉ์•ก์„ ํ˜ผํ•ฉํ•˜์—ฌ ํŠน์„ฑ ๊ฐ’์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋‘ ์šฉ์•ก์„ ์•Œ๊ณ  ์‹ถ๋‹ค.

 

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์šฉ์•ก์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋จผ์ € ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ด ์ค€๋‹ค.

 

์–‘์ชฝ ๋์— start ํฌ์ธํ„ฐ์™€ end ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ  ์„œ๋กœ ์ค‘์•™์„ ํ–ฅํ•ด ๊ฑฐ๋ฆฌ๋ฅผ ์ขํ˜€์ง€๋Š” ํ˜•ํƒœ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ ์šฉ์•ก์„ ๊ณจ๋ผ์ฃผ๋ฉด ๋œ๋‹ค.

arr[start] + arr[end] = -92 < 0 ์ด๋ฏ€๋กœ ๊ฐ’์ด ๋” ์ปค์ ธ์•ผ ํ•œ๋‹ค.

 

๋ฐฐ์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‘ ์ˆ˜์˜ ํ•ฉ์ด ์ปค์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” start ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ ์ด๋™ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

arr[start] + arr[end] = 5 > 0 ์ด๋ฏ€๋กœ ๊ฐ’์ด ๋” ์ž‘์•„์ ธ์•ผ ํ•œ๋‹ค.

 

๋‘ ์ˆ˜์˜ ํ•ฉ์ด ์ž‘์•„์ง€๊ธฐ ์œ„ํ•ด์„œ๋Š” end ํฌ์ธํ„ฐ๋ฅผ ํ•œ ์นธ ์ด๋™ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋‹ค start < end๊ฐ€ ๋˜๋Š” ์‹œ์ ์—์„œ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿ’ญ Java  Code

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {-99, 4, 7, -1, -2};
        int n = 5;
        Arrays.sort(arr);

        int start = 0, end = n-1;
        int min = Integer.MAX_VALUE;
        int[] ans = new int[2];
        while (start < end) {
            int sum = arr[start] + arr[end];

            if (min > Math.abs(sum)) {
                min = Math.abs(sum);
                ans[0] = arr[start];
                ans[1] = arr[end];

                if (sum == 0) break;
            }

            if (sum < 0) start++;
            else end--;
        }

        System.out.println(ans[0] + " " + ans[1]);
        // ์ถœ๋ ฅ : -2 4
    }
}

 

๐Ÿ”น ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ (Sliding Window)

  • ํˆฌ ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ณ ์ •ํ•ด์„œ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๋ฅผ ๊ฐ€๋ณ€์ ์œผ๋กœ ์žก๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ฐ„์˜ ์–‘์ชฝ ๋์ด ๋˜๋Š” ํฌ์ธํ„ฐ 2๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋ฐ˜๋ฉด, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ตฌ๊ฐ„์˜ ๊ธธ์ด๋ฅผ ๊ณ ์ •์ ์œผ๋กœ ์žก๊ธฐ ๋•Œ๋ฌธ์— ํฌ์ธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ๋ฐฐ์—ด์˜ ๋์ด ์–ด๋”˜์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฑ์ค€ 2559 ์ˆ˜์—ด ๋ฌธ์ œ์—์„œ๋Š” ์ˆ˜์—ด์—์„œ ์—ฐ์†์ ์ธ k์ผ์˜ ์˜จ๋„์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์•Œ๊ณ  ์‹ถ๋‹ค.

 

k ํฌ๊ธฐ์˜ ์œˆ๋„์šฐ๋ฅผ ๋ฐฐ์—ด์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜์—ฌ ์œˆ๋„์šฐ ๋‚ด์˜ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž.

๋จผ์ € 0๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ k-1๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ๋”ํ•ด sum์„ ๊ตฌํ•ด์ค€ ํ›„ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด ์ค€๋‹ค.

 

์œˆ๋„์šฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์›€์ง์ด๋ฉด,

์ƒˆ๋กœ ์œˆ๋„์šฐ์— ํฌํ•จ๋œ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋”ํ•˜๊ณ  ์œˆ๋„์šฐ์—์„œ ๋น ์ง€๊ฒŒ ๋œ ์™ผ์ชฝ ๊ฐ’์„ ๋นผ์ฃผ๋ฉด ๊ทธ๋‹ค์Œ ์œ„์น˜์˜ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‘ ๊ฐœ์˜ ํ•ฉ์„ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•ด ์ฃผ๊ณ , ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์—ด ๋๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ํƒ์ƒ‰ํ•œ๋‹ค.

๐Ÿ’ญ Java  Code

public class Main {
    public static void main(String[] args) {
        int n = 10;
        int k = 2;

        int[] arr = {3, -2, -4, -9, 0, 3, 7, 13, 8, -3};

        int sum = 0;
        for (int i = 0; i < k; i++) {
            sum += arr[i];
        }

        int ans = sum;
        for (int i = k; i < n; i++) {
            sum += (arr[i] - arr[i-k]);
            ans = Math.max(ans, sum);
        }

        System.out.println(ans);
    }
}

 

 

 

 

 

 

 

 

๐Ÿ“ƒ reference