ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] ์ˆœ์—ด๊ณผ ๋™์ ๊ณ„ํš๋ฒ•
    ์ž๋ฃŒ๊ตฌ์กฐ 2022. 10. 4. 20:40

     

    ๐Ÿ’Ÿ ๋ฌธ์ œ : ์ž…๋ ฅ ๊ธธ์ด n์ผ ๋•Œ n ์ดํ•˜์˜ ์ˆ˜์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์ˆœ์—ด์˜ ๊ฒฝ์šฐ๋ฅผ ๋‚˜์—ดํ•ด๋ณด์‹œ์˜ค.

     

    def combinations(s):
    	if len(s) < 2:
        	return s
        res = []
        for i,c in enumerate(s):
        	res.append(c)
            for j in combinations(s[:i]+s[i+1:1]):
            	res.append(c+j)
        return res

     

    ์ฝ”๋“œ ๋ถ„์„ :

    ์ˆœ์—ด์˜ ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ’€์–ด๋‚ธ ์ฝ”๋“œ์ด๋‹ค.

     

    ์žฌ๊ท€ํ•จ์ˆ˜ํ•˜๋‹ˆ๊นŒ ๋– ์˜ค๋ฅธ ๊ฒƒ์ด ๋™์ ๊ณ„ํš๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ๊ณ„ํš๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

     

    ๋™์  ๊ณ„ํš๋ฒ• ์ด๋ž€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ ํ•˜์œ„ ๋ฌธ์ œ๋“ค๋กœ ๋‚˜๋ˆ ์„œ ํ‘ธ๋Š” ๊ฒƒ์œผ๋กœ ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ์„œ๋กœ ์ข…์†์„ฑ์„ ๊ฐ€์งˆ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

    (Divide and Conquer๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค)

    ๋™์  ๊ณ„ํš๋ฒ•์€ ๋ชจ๋“  ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘๋ฉด์„œ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

    -> ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์ง€ ์•Š๊ณ  table์— ์ €์žฅ๋œ ๊ฐ’์„ ์ด์šฉํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ค„์–ด๋“ ๋‹ค!

    ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋™์ ๊ณ„ํš๋ฒ•์€ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋”ฐ์ ธ ๋ณด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ optimalํ•œ solution์„ ์–ป๋Š”๋‹ค.

     

    ์ด์ฒ˜๋Ÿผ ๋™์ ๊ณ„ํš๋ฒ•์„ ํ™œ์šฉํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ทธ๋ ‡๋‹ค๋ฉด ๋™์ ๊ณ„ํš๋ฒ•์ด ๋ญ”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ๋‹ค!

     

     

    ๋™์ ๊ณ„ํš๋ฒ•

    ์•ž์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ ๊ณ„ํš๋ฒ•์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

     

    ๋™์ ๊ณ„ํš๋ฒ•์€ ๋ณดํ†ต ๋‘๊ฐ€์ง€ ๋ฐฉ์‹ (ํƒ‘๋‹ค์šด๊ณผ ๋ณดํ…€์—…)์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

     

    ๋™์ ๊ณ„ํš๋ฒ•์€ ๋ฌธ์ œ๊ฐ€ ์•„๋ž˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    1. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure)

    : ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ๋“ค์˜ ๋‹ต์„ ๋ชจ์•„ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

    2. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ (Overlapping Subproblem)

    : ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

     

    (1) ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

     

    1, 1, 2, 3, 5, 8, 13, 21, 34, ...

     

    n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ f(n)์ด๋ผ๊ณ  ํ• ๋•Œ, 4๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ f(4)๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    f(4) = f(3) + f(2) = f(2) + f(1) + f(2)

     

    ์ด๋Ÿฌํ•œ ์ ํ™”์‹์€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์ˆ˜์—ด์€ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•œ๋‹ค.

    def fibo(x):
    	if x==1 or x==2:
        	return 1
        return fibo(x-1) + fibo(x-2)

    -> ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ๋Œ์ง€ ์•Š๊ณ  ํŠน์ • ์ง€์ ์—์„œ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ!!

    ํ•˜์ง€๋งŒ ๋‹จ์ˆœ ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ํ•ด๊ฒฐํ•˜๋ฉด ์ง€์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„(O(2^n))๋ฅผ ์ง€๋‹ˆ๊ฒŒ ๋œ๋‹ค. (์ค‘๋ณต๋˜๋Š” f๊ฐ’์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋‹ค์‹œ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)

    -> ์ด ๊ฒฝ์šฐ n์ด ์กฐ๊ธˆ๋งŒ ์ปค์ง€๋”๋ผ๋„ ์—ฐ์‚ฐ๋Ÿ‰์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค.

    -> ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•œ f๊ฐ’์„ ์ €์žฅํ•ด์•ผ ์ค‘๋ณตํ•ด์„œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

     

    ๊ทธ๋ ‡๋‹ค๋ฉด ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๋™์ ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•ด ํ’€์–ด๋ณด์ž!!

    ๋จผ์ € ๋™์ ๊ณ„ํš๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ํ•œ๋ฒˆ์”ฉ ์„ค๋ช…ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

     

    โ—Ž Memoization

    ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๋™์ ๊ณ„ํš๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

    ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ๋ฉ”๋ชจํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

     

    โ—Ž ํƒ‘๋‹ค์šด (ํ•˜ํ–ฅ์‹)

    ํฐ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉฐ (๊ตฌํ˜„ ๊ณผ์ •์—์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.) ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ชจ๋‘ ํ•ด๊ฒฐ๋˜์—ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ํฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต๊นŒ์ง€ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

    ์ด๋•Œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

     

    โ—Ž ๋ณดํ…€์—… (์ƒํ–ฅ์‹)

    ์•„๋ž˜์ชฝ์—์„œ๋ถ€ํ„ฐ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•˜๋ฉฐ ๋จผ์ € ๊ณ„์‚ฐํ–ˆ๋˜ ๋ฌธ์ œ๋“ค์˜ ๊ฐ’์„ ํ™œ์šฉํ•ด ๊ทธ ๋‹ค์Œ์˜ ๋ฌธ์ œ๋“ค๊นŒ์ง€ ํ™œ์šฉํ•œ๋‹ค. 

    ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„

     

    - ๋ณดํ†ต ๋™์ ๊ณ„ํš๋ฒ•์œผ๋กœ ๋งŽ์ด ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋ณดํ…€์—… ๋ฐฉ์‹์ด๋‹ค.

    # ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์ดˆ๊ธฐํ™”
    d = [0]*100    # ์ด 100๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง€๋Š” ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
    
    # ํƒ‘๋‹ค์šด ๋™์ ๊ณ„ํš๋ฒ•
    def fibo(x):
    	if x==1 or x==2    # ์ข…๋ฃŒ ์กฐ๊ฑด ๋ช…์‹œ
        	return 1
        if d[x] != 0:
        	return d[x]    # ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์  ์žˆ๋Š” ๋ฌธ์ œ๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
        d[x] = fibo(x-1) + fibo(x-2) # ์•„์ง ๊ณ„์‚ฐํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋ผ๋ฉด ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
        return d[x]

    ์œ„ ํƒ‘๋‹ค์šด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ธฐ์กด์˜ ์ ํ™”์‹์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ์€ ๊ฐ™์ง€๋งŒ, d๋ผ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•ด์ค€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!!

    # ๋ณดํ…€์—… ๋ฐฉ์‹์˜ ๋™์ ๊ณ„ํš๋ฒ• ์ฝ”๋“œ
    # ์•ž์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด DP ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
    d = [0]*100
    
    # ์ฒซ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘ ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
    d[1]=1
    d[2]=1
    
    #ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„
    for i in range(3,n+1):
    	d[i] = d[i-1]+d[i-2]
        
    print(d[n])

    ๋ณดํ…€์—… ๋ฐฉ์‹์€ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ํ™”์‹์—์„œ ์“ฐ์ด๋Š” ์ข…๋ฃŒ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐ˜๋ณต๋ฌธ ์‹œ์ž‘ ์ „์— ๋จผ์ € ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ, ๊ทธ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์กฐํ•ฉํ•ด ํฐ ๋ฌธ์ œ๋“ค์„ ์ฐจ๋ก€๋กœ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

    ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

     

    ๋Œ“๊ธ€

Designed by Tistory.