๋ฌธ์
https://www.acmicpc.net/problem/11050
๋ฐฑ์ค ๋จ๊ณ๋ณ๋ก ํ์ด๋ณด๊ธฐ - ์กฐํฉ๋ก
ํ์ด
์์ฐ์ N๊ณผ K๊ฐ ์ฃผ์ด์ก์๋, ์ดํญ๊ณ์ (n/k)๋ฅผ ๊ตฌํ๋ ๋ฌธ์ .
์ดํญ๊ณ์ (n/k)๋ nCk ์ ๊ฐ๋ค.
nCk = n!/(k!(n-k)!)
๋จ์ ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 36ms
# 1
N, K = map(int, input().split())
ret = 1
# 2
for i in range(K):
ret *= (N - i)
# 3
for i in range(1, K+1):
ret //= i
print(ret)
n! = (n * (n-1) * ... * (n-k+1)) * (n-k)!
์ด๊ฑธ ๋ค์ ๊ณต์์ ์ ์ฉํด์,
nCk = (n * (n-1) * ... * (n-k+1)) * (n-k)! / (k! * (n-k)!)
nCk = (n * (n-1) * ... * (n-k+1)) / k!
์ฆ, nCk = (n * (n-1) * ... * (n-k+1)) / (k * (k-1) * ... * 2 * 1)๊ฐ ๋๋ค.
map()์ผ๋กN๊ณผK๊ฐ์ ํ ๋นํด์ฃผ๊ณ , ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํret์ 1๋ก ํ ๋นํ๋ค.- ์ฒซ๋ฒ์งธ for๋ฌธ: (n * (n-1) * ... * (n-k+1))
- 0๋ถํฐ K-1๊น์ง i๋ก ๋ฐ๋ณต.
ret์ N-i๋ฅผ ๊ณฑํ ํ ์ฌํ ๋น.
- ๋๋ฒ์งธ for๋ฌธ: / (k * (k-1) * ... * 2 * 1)
- 1๋ถํฐ K๊น์ง i๋ก ๋ฐ๋ณต.
- ์ฒซ๋ฒ์งธ for๋ฌธ์ ๊ฑฐ์น
ret์ i๋ก ๋๋ ๋ค ์ฌํ ๋น.
๋์ ํ๋ก๊ทธ๋๋ฐ(DP) ์ฌ์ฉ
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 40ms
# 1
def dynamic_programming(n, k):
# 2
dp = [[0 for _ in range(k+1)] for _ in range(n+1)]
# 3
for i in range(n+1):
for j in range(k+1):
if j == 0 or j == i:
dp[i][j] = 1
else:
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
return dp[n][k]
# 4
N, K = map(int, input().split())
print(dynamic_programming(N, K))
- ๋์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํจ์๋ฅผ ์์ฑํด์ค๋ค.
ํ๋ผ๋ฏธํฐ๋ (์ ์ฒด ์งํฉ์ ์, ์ ํํ ์์์ ์) ๋ก ์ค์ ํ๋ค. - (n+1) x (k+1) ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด
dp๋ฅผ ์์ฑํ๋ค. - 0๋ถํฐ n๊น์ง i๋ก ๋ฐ๋ณต, 0๋ถํฐ k๊น์ง j๋ก ์ํํ๋ฉฐ ์๋์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ๋ง์ฝ j(์ด)์ด 0์ด๊ฑฐ๋ i์ผ๊ฒฝ์ฐ(=์๋ฌด๊ฒ๋ ์ ํํ์ง ์๊ฑฐ๋, ๋ชจ๋ ๋ค ์ ํํ ๊ฒฝ์ฐ),
dp[i][j]์ ๊ฐ์ 1๋ก ์ ์ฅํ๋ค. - ์๋๋ผ๋ฉด
dp[i][j]์ ๊ฐ์dp[i-1][j-1] + dp[i-1][j]๋ก ์ ์ฅํ๋ค. - ํ์ฌ ์ดํญ๊ณ์ = ๋ฐ๋ก ์ ํ์ ๋ ์ดํญ๊ณ์์ ํฉ (ํ์ค์นผ์ ์ผ๊ฐํ ์๋ฆฌ)
๋ฐ๋ณต์ ๋ง์น๋ฉดdp[n][k]์ ํด๋นํ๋ ๊ฐ์ ๋ฐํํ๋ค.
- ๋ง์ฝ j(์ด)์ด 0์ด๊ฑฐ๋ i์ผ๊ฒฝ์ฐ(=์๋ฌด๊ฒ๋ ์ ํํ์ง ์๊ฑฐ๋, ๋ชจ๋ ๋ค ์ ํํ ๊ฒฝ์ฐ),
N,K๋ฅผmap()์ผ๋ก ๊ฐ๊ฐ ํ ๋นํ ํ, ํจ์์ ๋ฃ์ด ์คํํ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฃผ์ด์ง๋ ์๊ฐ ์ปค์ง์๋ก ํจ์จ์ ์ด๋ผ๊ณ ํ๋ค.
์ค์ ๋ก ์คํ์๊ฐ์ ๋จ์๋ฐ๋ณต์ ์ฌ์ฉํ ์ฝ๋๊ฐ 4ms ๋ ๋นจ๋๋ค.
(์ฐธ๊ณ ) ํ์ค์นผ์ ์ผ๊ฐํ
์ค๋๋จน์๊ฒ๋ ๊ธฐ์ต์๋๋ ํ๊ตญ์ ํ์ค์นผ์ ์ผ๊ฐํ์ด ๊ธฐ์ต๋ ๋ฆฌ๊ฐ...
https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%8A%A4%EC%B9%BC%EC%9D%98_%EC%82%BC%EA%B0%81%ED%98%95
ํ์ค์นผ์ ์ผ๊ฐํ - ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์
์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . ํ์ค์นผ์ ์ผ๊ฐํ ์์ ์ซ์๋ค์ ๋ฐ๋ก ์ ์ค์ ์ธ์ ํ๋ ๋ ์ซ์์ ํฉ์ผ๋ก ์ ์๋๋ค. ํ์ค์นผ์ ์ผ๊ฐํ(Pascal's triangle)์ ์ํ์์ ์ดํญ๊ณ์๋ฅผ ์ผ๊ฐํ ๋ชจ์์ผ๋ก
ko.wikipedia.org