Algorithm/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€(BOJ) / Python] 1010๋ฒˆ: ๋‹ค๋ฆฌ ๋†“๊ธฐ

meeeeejin 2021. 3. 30. 21:29

๋ฌธ์ œ ๋งํฌ: www.acmicpc.net/problem/1010

 

1010๋ฒˆ: ๋‹ค๋ฆฌ ๋†“๊ธฐ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๊ฐ•์˜ ์„œ์ชฝ๊ณผ ๋™์ชฝ์— ์žˆ๋Š” ์‚ฌ์ดํŠธ์˜ ๊ฐœ์ˆ˜ ์ •์ˆ˜ N, M (0 < N ≤ M < 30)์ด ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

 

๋ฌธ์ œ ์„ค๋ช…

์‚ฌ์ดํŠธ์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ๋™์ชฝ์ด ๋งŽ์œผ๋ฏ€๋กœ (N <= M) ๋‹ค๋ฆฌ๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๋™์ชฝ์˜ ์‚ฌ์ดํŠธ๋ฅผ N๊ฐœ ๊ณ ๋ฅด๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์™€ ๊ฐ™๋‹ค. ์ฆ‰ M๊ฐœ ์ค‘ N๊ฐœ๋ฅผ ๋ฝ‘๋Š” ์กฐํ•ฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์ด๋•Œ ์ดํ•ญ ๊ณ„์ˆ˜(์กฐํ•ฉ์˜ ์ˆ˜) ๊ฐœ๋…์„ ์ด์šฉํ•œ๋‹ค. 

 

์ด๋•Œ ์ดํ•ญ๊ณ„์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ฑ์งˆ์ด ์žˆ๋‹ค. 

n๊ฐœ์˜ ์›์†Œ ์ค‘์—์„œ k๊ฐœ์˜ ์›์†Œ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ฅผ ํ•ฉํ•œ ๊ฒƒ์ด๋‹ค. 

  1. (n - 1)๊ฐœ ์›์†Œ ์ค‘์—์„œ k๊ฐœ์˜ ์›์†Œ๋ฅผ ๋ฝ‘๊ณ  n๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋ฒ„๋ฆฌ๊ธฐ
  2. (n - 1)๊ฐœ ์›์†Œ ์ค‘์—์„œ (k - 1)๊ฐœ์˜ ์›์†Œ๋ฅผ ๋ฝ‘๊ณ  n๋ฒˆ์งธ ์›์†Œ๋„ ํฌํ•จํ•˜๊ธฐ

์ด๊ฒƒ์„ ์‹์œผ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์ด ์œ„์˜ ์ˆ˜์‹์ด๋‹ค. ์ด๋Š” ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. ์ดํ•ญ ๊ณ„์ˆ˜๋ฅผ ์ €์žฅํ•  nxk ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ(bc) ์ƒ์„ฑ(๋˜๋Š” nxn ๋ฆฌ์ŠคํŠธ์—์„œ nxk๋งŒ ์‚ฌ์šฉ)
  2. ๋งŒ์•ฝ bc[i][j]์—์„œ j๊ฐ€ 0์ด๊ฑฐ๋‚˜ i์ผ ๊ฒฝ์šฐ ์ดํ•ญ ๊ณ„์ˆ˜์— 1 ์ €์žฅ
  3. ์•„๋‹ ๊ฒฝ์šฐ bc[i][j] = bc[i - 1][j - 1] + bc[i- 1][j]๋ฅผ ์ดํ•ญ ๊ณ„์ˆ˜ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ
  4. i = n, j = min(i, k)๊นŒ์ง€ 2~3๋ฒˆ ๋ฐ˜๋ณต ์ˆ˜ํ–‰

 

 

 

์†Œ์Šค์ฝ”๋“œ

T = int(input())

while T:
    n, m = map(int, input().split())
    # Binomial Coefficient๋ฅผ ์ €์žฅํ•  (m + 1)x(m + 1) ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
    bc = [[0]*(m + 1) for i in range(m + 1)]
    
    for i in range(m + 1):
        for j in range(min(i, n) + 1):
            if j == 0 or j == i:
                bc[i][j] = 1
            else:
                bc[i][j] = bc[i-1][j-1] + bc[i-1][j]

    print(bc[m][n])

    T -= 1

 

 

728x90