์ต๊ทผ์ ๋ฐฑ์ค์ ์ถ์ ๋ ๋ฌธ์ ๋ค์ ํ๊ธฐ ์์ํ๋ค. ๋ฐฑ์ค์์ ๋ ๋ฒ์งธ๋ก ํผ ๋ฌธ์ ๋ ํผ๋ณด๋์น ํจ์์๋๋ฐ, ํด๋น ๋ฌธ์ ๋ฅผ ํธ๋ ๊ณผ์ ์์ ๋ฐฐ์ด ์ ๋ค์ด ๋ช ๊ฐ์ง ์์ด ๊ธฐ๋ก์ฐจ ๋จ๊ฒจ๋๊ณ ์ ํ๋ค.
๋ฌธ์ ์ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์๋ค.
๋ฌธ์
๋ค์ ์์ค๋ 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)๋ฅผ ๋ ๊ณ ๋ คํ์.
- ์ ์ ์กฐ๊ฑด์ ํฌํจ๋ ์ฌํญ์ด ์๋๋๋ผ๋, ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๊ฒ์ ๊ฐ๋ฐ ์ค๋ ฅ์ ํค์ธ ์ ์๋ ์ค์ํ ๋ฐฉ๋ฒ์ด๋ค. ๋ '๋ ๋์ ๋ฐฉ๋ฒ'์ ๊ณ ๋ฏผํ๋ฉฐ ์ฝ๋๋ฅผ ์ง์ผ ํ๋ค.
'๐ป DEV > ใด problems' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ทธ๋ฆฌ๋(Greedy) : ์ฒด์ก๋ณต (0) | 2021.07.07 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์คํ/ํ(Stack/Queue) : ์ฃผ์๊ฐ๊ฒฉ (0) | 2021.05.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์คํ/ํ(Stack/Queue): ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2021.05.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์คํ/ํ(Stack/Queue): ํ๋ฆฐํฐ (0) | 2021.05.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์คํ/ํ(Stack/Queue): ๊ธฐ๋ฅ๊ฐ๋ฐ (0) | 2021.05.07 |
๋๊ธ