Computer Science/Algorithms

๐Ÿ“ฒ Divide&Conquer

metamong 2024. 6. 8.

* intro

๐Ÿป ๋ถ„ํ• (Divide)ํ•˜๊ณ  ์ •๋ณต(Conquer)ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถ„ํ•  → ์ •๋ณต → ๊ฒฐํ•ฉ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰

 

๐Ÿป

โ‘  ๋ถ„ํ• (Divide): ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-problem์œผ๋กœ ๋ถ„ํ• ํ•œ๋‹ค.

โ‘ก ์ •๋ณต(Conquer): ์žฌ๊ท€์ ์œผ๋กœ sub-problem๋“ค์„ ๊ฐ๊ฐ ํ•ด๊ฒฐํ•œ๋‹ค. ๋ฌธ์ œ๋“ค์„ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ํ•ด๊ฒฐ. 

โ‘ข ๊ฒฐํ•ฉ(Combine): ๊ฐ๊ฐ์˜ sub-problem ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฌถ์–ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์ข… ์†”๋ฃจ์…˜์„ ๋„์ถœ!

 

๐Ÿป ํฐ problem์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-problem์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์—์„œ recursion ์žฌ๊ท€๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ๋ถ„ํ• ์„ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋‚˜๋ˆ„๊ณ  ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” sub-problem ๊ฐ๊ฐ conquer(์ •๋ณต)ํ•œ ๋‹ค์Œ ๊ฐ sub-problem๋ณ„ conquer๋œ ๊ฒฐ๊ณผ๋ฅผ combine(๊ฒฐํ•ฉ)ํ•ด ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๋ฉด ๋œ๋‹ค.

 

๐Ÿป ์ƒํ™ฉ์— ๋”ฐ๋ผ combine ๊ณผ์ • ์—†์ด ์ผ๋ถ€๋งŒ ๋ถ„ํ• ํ•˜๊ณ  ์ผ๋ถ€๋งŒ ์ •๋ณตํ•œ ๋’ค ๋ฐ”๋กœ ์™„๋ฃŒํ•˜๋Š” ์œ ํ˜•๋„ ์กด์žฌ(combine ๊ฒฐํ•ฉ์ด ๋ฐ˜๋“œ์‹œ ํฌํ•จ๋˜์ง€๋Š” x)

* example

Q. Finding the maximum

๐Ÿป ์ œ์ผ ๊ฐ„๋‹จํ•œ, ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์ผ๋‹จ Divide & Conquer ๋‹จ๊ณ„์— ๋งž๊ฒŒ โ‘  ๋จผ์ € ๋งจ ์œ„์˜ ๊ธด Array์—์„œ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด๋‚˜๊ฐ€๋Š” ๊ณผ์ • Divide๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ โ‘ก ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ ๋ถ€ํ„ฐ Conquer๋ฅผ ์‹œ์ž‘ํ•ด์„œ โ‘ข ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ Combine์„ ํ•ด ๋‚˜๊ฐ„๋‹ค.

 

(1) divide: ์ผ๋‹จ ์ „์ฒด list๋ฅผ ๊ธธ์ด๊ฐ€ 2 ๋˜๋Š” 1์ด ๋  ๋•Œ๊นŒ์ง€ ์ ˆ๋ฐ˜์œผ๋กœ sub-problem์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋‚˜๊ฐ„๋‹ค

 

(2) conquer: ์ตœ์ข…์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ sub-problem์˜ ๊ฐ list์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•œ๋‹ค. ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฑด max() ์‚ฌ์šฉ ์—†์ด ๋ถ€๋“ฑ์‹์œผ๋กœ ์ง„ํ–‰

 

(3) combine: ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ์—์„œ divide&conquer๋งŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ฐ๊ฐ conquer๋œ ๊ฒฐ๊ณผ๋ฅผ combineํ•ด ๋‹ค์‹œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋˜ conquerํ•˜๊ณ  combineํ•˜๋Š” ๋ฐฉ์‹ ๊ณ„์† ์ง„ํ–‰

def find_maximum(i,length):
    if length <= 2:
        if length == 1:
            return l[i]
        else:
            if l[i] >= l[i+1]:
                return l[i]
            else:
                return l[i+1]
    
    if length%2 == 0:
        left, right = find_maximum(i,length//2), find_maximum(i+length//2,length//2)
        if left >= right:
            return left
        else:
            return right
    else:
        left, right = find_maximum(i,length//2), find_maximum(i+length//2,length//2+1)
        if left >= right:
            return left
        else:
            return right
l = list(map(int,input('input your integers: ').split()))

print(find_maximum(0,len(l)))

* properties

โ‘  ์ฆ‰, DP๋Š” ์—ฌ๋Ÿฌ sub-problem์ด ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋งŒ(subproblems are evaluated many times), DAC๋Š” ์—ฌ๋Ÿฌ sub-problem์ด ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค(evaluated only once)

โ‘ก ํฐ ๊ณต๊ฐ„ ์—†์ด cache memory ํšจ์œจ์ ์ธ ์‚ฌ์šฉ

โ‘ข Quick Sort์™€ Merge Sort์— ์‚ฌ์šฉ๋˜๋Š” ๋ถ„ํ• -์ •๋ณต

โ‘ฃ ํฐ problem์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-problems๋กœ ๋‚˜๋ˆŒ ๋•Œ ๊ตฌํ˜„์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

 

โ˜… ๋ถ„ํ• ์ •๋ณต์œผ๋กœ sub-problem์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜๋ˆŒ ๋•Œ ์žฌ๊ท€ํ•จ์ˆ˜ ๋‚ด์˜ ์ธ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•  ์ง€ ๊ณ ๋ฏผํ•˜๊ณ , ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด์ž

* exercises

โ˜… <BOJ S2 2630 ์ƒ‰์ข…์ด ๋งŒ๋“ค๊ธฐ> โ˜…

: ์ •์‚ฌ๊ฐํ˜•์„ ๋‚˜๋ˆ„์–ด์„œ ํ•˜์–€ ์˜์—ญ, ํŒŒ๋ž€ ์˜์—ญ ์ƒ‰์ข…์ด์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

โ˜… <BOJ S2 1780 ์ข…์ด์˜ ๊ฐœ์ˆ˜> โ˜…

: 4๋“ฑ๋ถ„์ด ์•„๋‹Œ 9๋“ฑ๋ถ„์œผ๋กœ divide

 

โ˜… <BOJ S1 1074 Z> โ˜…

: 4๋“ฑ๋ถ„ํ•ด์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ณณ๋งŒ depth ๊ณ„์† divideํ•˜๊ณ  conquerํ•œ ๋’ค ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ


geeksforgeeks

 

 

 

'Computer Science > Algorithms' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿซ‚ Prefix Sum  (1) 2024.09.06
๐Ÿฃ Fibonacci Sequence  (0) 2024.06.26
๐Ÿš€ Power by Divide and Conquer  (1) 2024.06.06
๐Ÿ›ฃ๏ธ Shortest Path in an Unweighted Graph  (0) 2024.05.23
โ›† Flood Fill  (0) 2024.05.19

๋Œ“๊ธ€