๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/ใ„ด problems

[๋ฐฑ์ค€] 1003๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜

by vodkassi 2021. 3. 11.
728x90

์ตœ๊ทผ์— ๋ฐฑ์ค€์— ์ถœ์ œ๋œ ๋ฌธ์ œ๋“ค์„ ํ’€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.  ๋ฐฑ์ค€์—์„œ ๋‘ ๋ฒˆ์งธ๋กœ ํ‘ผ ๋ฌธ์ œ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์˜€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ณผ์ •์—์„œ ๋ฐฐ์šด ์ ๋“ค์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ์–ด ๊ธฐ๋ก์ฐจ ๋‚จ๊ฒจ๋‘๊ณ ์ž ํ•œ๋‹ค. 

 

๋ฌธ์ œ์˜ ์ง€๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค. 


๋ฌธ์ œ

๋‹ค์Œ ์†Œ์Šค๋Š” N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” C++ ํ•จ์ˆ˜์ด๋‹ค.

 

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(nโ€1) + fibonacci(nโ€2);
    }
}

 

fibonacci(3)์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค.

  • fibonacci(3)์€ fibonacci(2)์™€ fibonacci(1) (์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ)์„ ํ˜ธ์ถœํ•œ๋‹ค.
  • fibonacci(2)๋Š” fibonacci(1) (๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ)๊ณผ fibonacci(0)์„ ํ˜ธ์ถœํ•œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœํ•œ fibonacci(1)์€ 1์„ ์ถœ๋ ฅํ•˜๊ณ  1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • fibonacci(0)์€ 0์„ ์ถœ๋ ฅํ•˜๊ณ , 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • fibonacci(2)๋Š” fibonacci(1)๊ณผ fibonacci(0)์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ , 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœํ•œ fibonacci(1)์€ 1์„ ์ถœ๋ ฅํ•˜๊ณ , 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • fibonacci(3)์€ fibonacci(2)์™€ fibonacci(1)์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ , 2๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

1์€ 2๋ฒˆ ์ถœ๋ ฅ๋˜๊ณ , 0์€ 1๋ฒˆ ์ถœ๋ ฅ๋œ๋‹ค. N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, fibonacci(N)์„ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ, 0๊ณผ 1์ด ๊ฐ๊ฐ ๋ช‡ ๋ฒˆ ์ถœ๋ ฅ๋˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


ํ’€์ด # 1 : 

 

ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋Š” ๋‚œ์ƒ ์ฒ˜์Œ ์ ‘ํ–ˆ์ง€๋งŒ ์ง€๋ฌธ์„ ์ฒœ์ฒœํžˆ ์ฝ์œผ๋‹ˆ ์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ๊ธˆ๋ฐฉ ์ดํ•ด๊ฐ€ ๊ฐ”๋‹ค. (๋ฌธ์ œ๋ฅผ ํ‘ผ ์ดํ›„ ์ฐพ์•„๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ์ดˆ ๊ฒฉ์ด๋ผ ๋ชจ๋‘๊ฐ€ ํ•œ ๋ฒˆ์”ฉ์€ ๋‹ค ํ’€์–ด๋ณด๋Š” ๊ฒƒ ๊ฐ™๋‹ค) 

 

์ฒ˜์Œ์— ๋– ์˜ฌ๋ฆฐ ๋ฐฉ๋ฒ•์€ 0๊ณผ 1์˜ ํšŸ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ ์ˆ˜๋ก ์ฆ๊ฐ€ํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.  fibonacci(0)์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค zero ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , fibonacci(1)์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค one ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ๋งˆ์ง€๋ง‰์— ๋ˆ„์ ๋œ ์ด๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค์–ด fibonacci(3) ์ผ ๊ฒฝ์šฐ fibonacci(2) + fibonacci(1) == fibonacci(1) + fibonacci(0) + fibonacci(1) ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, one = 2, zero = 1  ์ด ๋˜์–ด, (1, 2) ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. 

 

def find_zero_one(num, zero=0, one=0):

    if num == 0:
        zero += 1
    elif num == 1:
        one += 1
    else:
        a, b = find_zero_one(num-1)
        c, d = find_zero_one(num-2)
        zero = zero + a + c
        one = one + b + d
    return zero, one

์ฒซ ๋ฒˆ์งธ ํ’€์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์„ ๋•Œ๋Š” ์‹คํ–‰์ด ์ž˜ ๋˜์—ˆ์ง€๋งŒ, ์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ ํ•จ์ˆ˜์— ์ž…๋ ฅ๋˜๋Š” n์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ์—ฐ์‚ฐ๋Ÿ‰๋„ ํ•จ๊ป˜ ์ฆ๊ฐ€ํ•˜์—ฌ, ์—ฐ์‚ฐ ์†๋„๊ฐ€ ํ„ฐ๋ฌด๋‹ˆ์—†์ด ๋Š๋ ค์ง„๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. timeit ๋ชจ๋“ˆ์„ ํ†ตํ•ด ํ•จ์ˆ˜์˜ ์†๋„๋ฅผ ๊ตฌํ•ด๋ณธ ๊ฒฐ๊ณผ, 30์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์•ฝ 0.53์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„๋ƒˆ๋‹ค.

 

ํ•ด๋‹น ๋ฌธ์ œ์—๋Š” 0.25s์˜ ์‹œ๊ฐ„ ์ œํ•œ์ด ๊ฑธ๋ ค ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ฒซ ๋ฒˆ์งธ ํ’€์ด๋Š” ๋ฒ„๋ฆฌ๊ณ  ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.


ํ’€์ด # 2 : 

 

ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์ค‘๋ณต ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. 

 

๊ฐ€๋ น, ์•ž์„œ ์–˜๊ธฐํ•œ fibonacci(3)์˜ ๊ฒฝ์šฐ, fibonacci(1) ํ•จ์ˆ˜๊ฐ€ 2๋ฒˆ ์‹คํ–‰๋˜๊ฒŒ ๋˜๋Š”๋ฐ, input์ด ์ปค์งˆ์ˆ˜๋ก ๋‹น์—ฐํžˆ ์ค‘๋ณต ์‹คํ–‰์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์ž์—ฐ์Šค๋ ˆ 'ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ์ค‘๋ณต ์‹คํ–‰๋  ๊ฒฝ์šฐ์—๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?' ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.  ์ด ์ƒ๊ฐ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜๋Š” ์ž๋ฃŒํ˜• ์ค‘ dict ๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค. Key(ํ•จ์ˆ˜์˜ input) ์— ๋”ฐ๋ผ Value (ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’)์„ ์ถœ๋ ฅํ•˜๊ธฐ์— ์šฉ์ดํ•  ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

def find_zero_one(num):
    if num == 0:           # fib(0)์ผ ๊ฒฝ์šฐ 0์€ 1ํšŒ, 1์€ 0ํšŒ ๋ฐ˜ํ™˜
        return 1, 0
    elif num == 1:         # fib(1)์ผ ๊ฒฝ์šฐ 0์€ 0ํšŒ, 1์€ 1ํšŒ ๋ฐ˜ํ™˜
        return 0, 1
    else:                  # fib(n), n>=2์ผ ๊ฒฝ์šฐ
        fib = {0:0, 1:1}
        for n in range(2, num+1):    
            fib[n] = fib[n-1] + fib[n-2]
        return fib[num-1], fib[num]

 

๋ณด์‹œ๋‹ค์‹œํ”ผ input ์ด 2๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํด ๊ฒฝ์šฐ, dict ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›๋Š” ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ’๋„ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค.  ์ค„๊ธ€๋กœ ํ’€์–ด์“ฐ๊ธฐ ์–ด๋ ต์ง€๋งŒ ์ฝ”๋“œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ํ’€์–ด๋ณด๋ฉด ์ด๋Ÿฐ ํ˜•์‹์ด๋‹ค.

๋ฐ˜๋ณต๋ฌธ์˜ ๋‚ด๋ถ€๊ตฌ์กฐ

์ˆ˜์ •๋œ ํ•จ์ˆ˜๋กœ ์•„๊นŒ์™€ ๊ฐ™์ด input ์„ 30์œผ๋กœ ํ–ˆ์„ ๋•Œ, ์—ฐ์‚ฐ ์†๋„๊ฐ€ 1.0931000000002217e-05 ๋กœ ์ค„์–ด๋“ค์—ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•ด ์ œ์ถœํ–ˆ๋‹ค! 

 

# ์ฝ”๋“œ ์™„์„ฑ๋ณธ

num = int(input())

def find_zero_one(num):
    if num == 0:
        return 1, 0
    elif num == 1:
        return 0, 1
    else:
        fib = {0:0, 1:1}
        for n in range(2, num+1):
            fib[n] = fib[n-1] + fib[n-2]
        return fib[num-1], fib[num]

for i in range(num):

    n = int(input())
    result = find_zero_one(n)
    print(result[0], result[1])

์ฃผ์˜ํ•  ์  : 

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€๋ฉฐ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์  ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ฒด๋“ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ž˜ ๊ธฐ์–ตํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ์ง์ ‘ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ๋„ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์•„ ์ ์–ด๋ณธ๋‹ค. 

 

1. ์ „์ œ์กฐ๊ฑด์„ ์ž˜ ํ™•์ธํ•˜์ž.

  • ์‹œ๊ฐ„ ์ œํ•œ์ด ์žˆ๋Š” ์ค„ ๋ชจ๋ฅด๊ณ  ์™„์„ฑํ•œ ์ฝ”๋“œ๋Š” ๊ฒฐ๊ตญ '์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š”' ์ฝ”๋“œ์˜€๋‹ค. ๋ฌด์กฐ๊ฑด ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์˜จ๋‹ค๊ณ  ์ข‹์•„ํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชฉ์ ์— ๋งž๋Š”, ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค.
  • ๊ฐ’์ด ์–ด๋–ค ์‹์œผ๋กœ ์ž…๋ ฅ๋˜๋Š”์ง€ ์ž˜ ์‚ดํŽด๋ณด์ž. input() ๋ถ€๋ถ„์„ ์ž˜๋ชป ์ดํ•ดํ•˜๋Š” ๋ฐ”๋žŒ์— ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๋‹ค.

2. ์‹œ๊ฐ„ ๋ณต์žก๋„ (Time complexity)๋ฅผ ๋Š˜ ๊ณ ๋ คํ•˜์ž.

  • ์ „์ œ ์กฐ๊ฑด์— ํฌํ•จ๋œ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋”๋ผ๋„, ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ ์‹ค๋ ฅ์„ ํ‚ค์šธ ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋Š˜ '๋” ๋‚˜์€ ๋ฐฉ๋ฒ•'์„ ๊ณ ๋ฏผํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค.  

๋Œ“๊ธ€