Computer Science/Algorithms

๐Ÿš€ Power by Divide and Conquer

metamong 2024. 6. 6.

intro

๐Ÿ…ฐ๏ธ ๋ถ„ํ• ์ •๋ณต(divide & conquer)์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์‰ฌ์šด ๋ฌธ์ œ๋“ค๋กœ ์ชผ๊ฐœ์„œ ํ•ด๊ฒฐํ•˜๋Š” ์ ‘๊ทผ๋ฒ•. ์ •์ˆ˜์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ถ„ํ• ์ •๋ณต ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด ๋” ํšจ์œจ์ ์ธ ์‹œ๊ฐ„ ๋‚ด์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

'์‹ค์ˆ˜ a์™€ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜ x์— ๋Œ€ํ•ด a^x๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ'

โ‘  x = 1์ด๋ฉด ๋‹ต์€ a๋กœ ์ง์ ‘ ํ•ด๊ฒฐ

→ ์‹œ๊ฐ„๋ณต์žก๋„ O(1)

 

โ‘ก  x > 1์ด๋ฉด sub-problems๋กœ ์ชผ๊ฐœ๊ธฐ.

๐Ÿ…ฐ๏ธ x๊ฐ€ ์ง์ˆ˜๋ผ๋ฉด a^(x/2) x a^(x/2)

๐Ÿ…ฐ๏ธ x๊ฐ€ ํ™€์ˆ˜๋ผ๋ฉด a^((x-1)/2) x a^ ((x-1)/2) x a

์‹œ๊ฐ„๋ณต์žก๋„ T(x) = T(x/2) + O(1). ์ฆ‰ T(x) = O(logx)

example 7^10

๐Ÿ…ฐ๏ธ ์˜ˆ๋ฅผ ๋“ค์–ด 7^10์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ๋‚˜๋ˆ„์–ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ,

 

โ‘  7์„ 10๋ฒˆ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ. ๊ณฑ์…ˆ ํšŸ์ˆ˜ 10๋ฒˆ ์นด์šดํŠธ (7x7x7x7x7x7x7x7x7x7)

โ‘ก ์ง€์ˆ˜์ธ 10์„ ๋ฐ‘์„ 2๋กœ ํ•˜๋Š” log ์—ฐ์‚ฐ์œผ๋กœ ์ชผ๊ฐœ์–ด ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ์œผ๋กœ ๊ตฌํ•˜๋Š” ์—ฐ์‚ฐ

 

→ โ‘ ์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ / โ‘ก๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„ O(log2(์ง€์ˆ˜)) ์ด๋ฏ€๋กœ ์ง€์ˆ˜๊ฐ€ 1์กฐ๋ฅผ ๋„˜์–ด๋„ ๊นŠ์ด๊ฐ€ 40์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์˜ˆ๋ฅผ ๋“ค์–ด 7์˜ 1์–ต์Šน๋„ ์‰ฝ๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป

 

→ 7์˜ 10์Šน์„ ๊ตฌํ•ด๋ณด์ž. ์ง€์ˆ˜์ธ 10์€ ์ง์ˆ˜์ด๋ฏ€๋กœ 7์˜ 5์Šน์„ ์ œ๊ณฑํ•œ ๊ฒƒ. ๋”ฐ๋ผ์„œ 7์˜ 5์Šน์„ ํ•œ ๋ฒˆ ๊ตฌํ•˜๋ฉด ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ๋” ๊ณฑํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. 7์˜ 5์Šน์„ ํ•œ ๋ฒˆ ๋” ๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฉด 7์˜ 5์Šน์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์   7์˜ 2์Šน์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 7์˜ 2์Šน์„ ๊ตฌํ•˜๋ฉด ๊ตฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ๋” ๊ณฑํ•˜๊ณ  7๋งŒ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ 7์˜ 2์Šน์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด 7์˜ 1์Šน์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 7์˜ 1์Šน์„ ๊ตฌํ•˜๋ฉด ๊ตฌํ•œ ๊ฒฐ๊ณผ์— ํ•œ ๋ฒˆ ๋” ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋•Œ 7์˜ 1์Šน์—์„œ ์ง€์ˆ˜๊ฐ€ 1์ด๋ฏ€๋กœ recursion ์ข…๋ฃŒํ•˜๊ณ  7์˜ 1์Šน ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

→ ์ด๋ ‡๊ฒŒ ์žฌ๊ท€์ ์œผ๋กœ ํฐ problem์„ ์ง€์ˆ˜๊ฐ€ ํ™€์ˆ˜์ธ์ง€ ์ง์ˆ˜์ธ์ง€์— ๋”ฐ๋ผ sub-problem์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๋ถ„ํ• ๋œ sub-problem์„ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋ฉด์„œ ๋‹ค์‹œ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š”(recursion) 'divide & conquer' ์œ ํ˜•์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ O(logn)) (n์€ ์ง€์ˆ˜) ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

→ ์•„๋ž˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ฐธ์กฐ(a์˜ b์ œ๊ณฑ ๊ตฌํ•˜๊ธฐ)

def get_power(a,b):
    if b == 1:
        return a
    
    x = get_power(a,b//2)

    if b % 2 == 0:
        return x * x
    else:
        return x * x * a

+ modulo operation

modulo multiplication property

๐Ÿ…ฐ๏ธ ๋‹ค๋งŒ, a์˜ b์ œ๊ณฑ ๊ฒฐ๊ณผ๊ฐ€ b๊ฐ€ ๋งค์šฐ ํด ๊ฒฝ์šฐ, ์ปดํ“จํ„ฐ๊ฐ€ ํฐ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ๊ฐ๋‹นํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด ๋•Œ, modulo ์—ฐ์‚ฐ, ์ฆ‰ ๋งค์šฐ ํฐ ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•์œผ๋กœ ๋Œ€๋ถ€๋ถ„ ์ถœ์ œ. ์ด ๋•Œ ๋ชจ๋“ˆ๋Ÿฌ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ์„ฑ์งˆ(modulo multiplication property)์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ex) ์ฆ‰, 10์„ 3์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” (5๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€) x (2๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€)์™€ ๋™์ผ. 3๊ฐœ ์ด์ƒ์˜ ์ˆ˜๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ์˜ modulo opertation๋„ ๋™์ผํ•œ ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. 30์„ 7๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด (3์„ 7๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€) x (2๋ฅผ 7๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€) x (5๋ฅผ 7๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€)์ด๋‹ค.

modulo addition / subtraction property

๐Ÿ…ฐ๏ธ ๋ชจ๋“ˆ๋กœ ๊ณฑ์…ˆ ์„ฑ์งˆ์— ์ด์–ด ๋ง์…ˆ / ๋บ„์…ˆ ์„ฑ์งˆ๋„ ๋™์ผํ•˜๋‹ค.

+ ์ถ”๊ฐ€๋กœ ๋ชจ๋“ˆ๋กœ ๊ณฑ์…‰ ์—ญ์›(modular inverse), ์ฆ‰ ๋‚˜๋ˆ—์…ˆ ๊ด€๋ จ ๋ชจ๋“ˆ๋กœ ์„ฑ์งˆ์€ ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ์™€ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ ์„ฑ์งˆ์„ ๊ฒฐํ•ฉํ•ด์„œ ์—ฐ์‚ฐ ํ•ด์•ผ ํ•œ๋‹ค. ๋ณ„๋„ ํฌ์ŠคํŒ… ์ฐธ์กฐ

a^b (mod c)

๐Ÿ…ฐ๏ธ ์œ„ modulo property์— ์˜ํ•ด a์˜ b์ œ๊ณฑ์„ c๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€์— ๋Œ€ํ•ด ๊ตฌํ•ด๋ณด์ž

def get_power(a,b,c):
    if b == 1:
        return a%c
        
    x = get_power(a,b//2,c)

    if b % 2 == 0:
        return ((x%c) * (x%c)) % c
    else:
        return ((x%c) * (x%c) * (a%c))%c

 

: ์œ„ ์ฝ”๋“œ์—์„œ %c(divisor)๋ฅผ ํ•ญ๋งˆ๋‹ค ํ•ด์ฃผ์–ด์„œ modulo multiplication property์— ์˜ํ•ด ๋‹จ์ˆœํžˆ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Power by Divide & Conquer exercises

examples

โ˜… <BOJ S1 1629 ๊ณฑ์…ˆ> โ˜…

: ์œ„ ์˜ˆ์ œ ์ฝ”๋“œ์™€ ๊ทธ๋Œ€๋กœ ๋™์ผ. A^B์„ C๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๋ถ„ํ•  ์ •๋ณต ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

 

โ˜… <BOJ S1 11819 The Shortest does not Mean the Simplest> โ˜…

: ์œ„ 1629 ๊ณฑ์…ˆ ๋ฌธ์ œ์™€ ๋™์ผ ๋ฌธ์ œ

 

โ˜… <BOJ S3 13171 A> โ˜…

: ๋ถ„ํ• ์ •๋ณต์„ ์ด์šฉํ•œ ๊ฑฐ๋“ญ์ œ๊ณฑ ๋‚ด์šฉ์„ ๋ฌธ์ œ์—์„œ ๊ทธ๋Œ€๋กœ ์„ค๋ช…ํ•ด์คŒ. ์œ„ ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด A^B๋ฅผ 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

 

โ˜… <BOJ G5 15717 ๋–กํŒŒ์ด์–ด> โ˜…

: ๊ฐ€์ง“์ˆ˜๋Š” 2^(N-1)์ž„์„ ์•Œ๊ณ  2^(N-1)์„ 10^9+7๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

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

๐Ÿฃ Fibonacci Sequence  (0) 2024.06.26
๐Ÿ“ฒ Divide&Conquer  (1) 2024.06.08
๐Ÿ›ฃ๏ธ Shortest Path in an Unweighted Graph  (0) 2024.05.23
โ›† Flood Fill  (0) 2024.05.19
๐Ÿ˜๏ธEuler Sieve  (1) 2024.04.21

๋Œ“๊ธ€