ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algorithm] ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ
    Algorithm 2023. 5. 9. 09:14

    ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ž€?

    ๊ณ ์ •๋œ ๊ธธ์ด์˜ 2๊ฐœ์˜ ํฌ์ธํ„ฐ (์ปค์„œ)๋ฅผ ๊ฐ™์ด ์›€์ง์ด๋ฉด์„œ O(N)์— ๋ฐฐ์—ด์„ ํƒ์ƒ‰ํ•˜๋Š” ํ…Œํฌ๋‹‰

    N๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด์ด ์žˆ๊ณ , W์˜ ๋„“์ด๋ฅผ ๊ฐ–๋Š” ์ฐฝ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. (N, W๋Š” ๊ณ ์ •๋œ ์ƒ์ˆ˜)

    • ์ฐฝ๋ฌธ์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•œ ์นธ์”ฉ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•œ๋‹ค.
    • ์ด๋™์‹œํ‚ฌ ๋•Œ๋งˆ๋‹ค ์ฐฝ๋ฌธ ์•ˆ์—์„œ์˜ ์ •๋ณด ์œ ์ถœ (ex. ํ•ฉ)์ด ํ•„์š”ํ•˜๋‹ค.

     

    ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10๊ฐœ์ด๋ฉด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ๊ฐ€ 3์ผ ๋•Œ์ด๋‹ค.

     

    ๋ฌธ์ œ์—์„œ ๋Œ€๋†“๊ณ  ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ผ๊ณ  ์–ธ๊ธ‰ํ•  ๋•Œ๋„ ์žˆ์ง€๋งŒ, ๋ช‡๋ช‡ ๋ฌธ์ œ๋“ค์€ ์–ธ๊ธ‰ ์—†์ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํ…Œํฌ๋‹‰์„ ์จ์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

     

     

    ๐Ÿ’ก ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

    • ์œˆ๋„์šฐ๋ฅผ ํ•œ ์นธ ์˜ฎ๊ธฐ๋ฉด (W-1)์นธ์€ ๊ฒน์นœ๋‹ค.
    • ์ด์ „์— ๋‚ด๊ฐ€ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ์ฐฝ๋ฌธ์˜ ํ˜•ํƒœ์™€ ๋‹ค์Œ ์ƒํƒœ ์‚ฌ์ด์—์„œ ์ค‘๋ณต๋œ ์ •๋ณด๊ฐ€ W-1๊ฐœ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์ž!

     

    ์›๋ž˜๋Œ€๋กœ๋ผ๋ฉด, ์œˆ๋„์šฐ๋ฅผ ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ผ์ผํžˆ ๋”ํ•ด์•ผ ํ•œ๋‹ค.

    ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ , ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด O(1)๋งŒ์— ๋‘๋ฒˆ์งธ ์œˆ๋„์šฐ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

     

     

    ๊ธฐ์กด์—๋Š” ๋ชจ๋“  ์œˆ๋„์šฐ๋งˆ๋‹ค O(W)์— ํ•ฉ์„ ๊ตฌํ•ด์„œ ์ „์ฒด๊ฐ€ O(NW)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์กŒ๋‹ค.

     

    ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•„์ด๋””์–ด๋ฅผ ์ ์šฉํ•˜๋ฉด,

    ๋งจ ์ฒ˜์Œ ์ฐฝ๋ฌธ์— ๋Œ€ํ•ด์„œ๋งŒ O(W)์ด๊ณ , ์ดํ›„์— ํ•œ ์นธ์”ฉ ๋ฐ€ ๋•Œ์—๋Š” O(1)์— ๊ตฌ๊ฐ„ ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ฒฐ๊ตญ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด ๋œ๋‹ค.

     

    ์˜ˆ์‹œ) ์—ฐ์†๋œ 3๊ฐœ์˜ ํ•ฉ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑํ•˜๊ธฐ

    7๊ฐœ์˜ a0, a1, a2, … , a6์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด ์žˆ๋‹ค. ์ด ์ˆ˜์—ด์—์„œ ์—ฐ์†๋œ 3๊ฐœ์˜ ๊ฐ’์˜ ํ•ฉ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

     

     

    ์ด๋ฅผ ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ํ‘ผ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    int answer = 0;
    
    for (int i = 0; i <= n - m; i++) {
    	int sum = 0;
    
    	for (int j = 0; j < m; j++) {
    		sum += a[i + j];
    		answer = max(answer, sum);
    	}
    }

    ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” N๊ฐœ์˜ ์ˆ˜์—ด์—์„œ ์—ฐ์†๋œ M๊ฐœ์˜ ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์€ ๊ฒฝ์šฐ๋ผ๋ฉด O(NM)์ด๋‹ค.

     

     

    ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ํ•˜๋Š” ๋ฐฉ๋ฒ•

    1. ์œˆ๋„์šฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •ํ•œ๋‹ค.
    2. ์ฒซ๋ฒˆ์งธ ์œˆ๋„์šฐ์—์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
    3. ์ฒซ๋ฒˆ์งธ ๊ณ„์‚ฐ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œˆ๋„์šฐ๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋ฉฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

     

    ์œ„ ๋ฐฉ๋ฒ•์„ ์•ž์˜ ์˜ˆ์ œ์— ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

     

     

    1. ์œˆ๋„์šฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •ํ•œ๋‹ค. ⇒ ์—ฐ์†๋œ 3๊ฐœ์˜ ๊ฐ’์„ ๋ด์•ผํ•˜๋ฏ€๋กœ, ์œˆ๋„์šฐ ํฌ๊ธฐ = 3

    2. ์ฒซ๋ฒˆ์งธ ์œˆ๋„์šฐ์—์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค. ⇒ a[0] + a[1] + a[2] = 9์ด๋‹ค.

    3. ์ฒซ๋ฒˆ์งธ ๊ณ„์‚ฐ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œˆ๋„์šฐ๋ฅผ ์˜ฎ๊ฒจ๊ฐ€๋ฉฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

    • ํ˜„์žฌ ๊ฐ’์—์„œ a[leftPointer]๋ฅผ ๋นผ์ฃผ๊ณ  left๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • right๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ ํ›„, ํ˜„์žฌ ๊ฐ’์— a[rightPointer]๋ฅผ ๋”ํ•ด์ค€๋‹ค.
    answer = max(answer, current);
    
    current -= a[leftPointer];
    leftPointer += 1;
    rightPointer += 1;
    current += a[rightPointer];

     

     

    ์ž์„ธํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

     

    leftPointer rightPointer a[leftPointer] + a[rightPointer]
    0 2 9
    1 3 13
    2 4 10
    3 5 13
    4 6 7
    5 7 ์ข…๋ฃŒ!

     

    ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

    ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์—์„œ ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๊ฐ€ m์ผ ๋•Œ, rightPointer๊ฐ€ m-1๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ n๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€ ์›€์ง์ธ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— O(N-M)์ด๊ณ , ๋ณดํ†ต N > M์ด๋ฏ€๋กœ O(N)์ด๋ผ๊ณ  ํ•œ๋‹ค.

    int leftPointer = 0;
    int rightPointer = m - 1;
    int answer = 0;
    int current = 0;
    
    while (rightPointer < N) {
    	answer = max(answer, current);
    	current -= a[leftPointer];
    	leftPointer += 1;
    	rightPointer += 1;
    	current += a[rightPointer];
    }
    

     

    ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ์˜ ์ฐจ์ด

    • ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ → ๊ตฌ๊ฐ„์ด ๊ฐ€๋ณ€์  ๊ธธ์ด
    • ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ → ๊ตฌ๊ฐ„์ด ๊ณ ์ •์  ๊ธธ์ด

     

    ๊ด€๋ จ ๋ฌธ์ œ๋“ค

    ๋ฐฑ์ค€ 12847๋ฒˆ

    ์ถ”๊ฐ€๋กœ ์—…๋ฐ์ดํŠธ ์˜ˆ์ •~!

     

     

    [์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜] Sliding Window, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

    ๋Œ“๊ธ€

Designed by Tistory.