Algorithm

[๋ฐฑ์ค€] 1010. ๋‹ค๋ฆฌ ๋†“๊ธฐ python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 1010๋ฒˆ ๋‹ค๋ฆฌ๋†“๊ธฐ

๐Ÿ• ๋ฌธ์ œ

์žฌ์›์ด๋Š” ํ•œ ๋„์‹œ์˜ ์‹œ์žฅ์ด ๋˜์—ˆ๋‹ค. ์ด ๋„์‹œ์—๋Š” ๋„์‹œ๋ฅผ ๋™์ชฝ๊ณผ ์„œ์ชฝ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํฐ ๊ฐ•์ด ํ๋ฅด๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์žฌ์›์ด๋Š” ๋‹ค๋ฆฌ๊ฐ€ ์—†์–ด์„œ ์‹œ๋ฏผ๋“ค์ด ๊ฐ•์„ ๊ฑด๋„ˆ๋Š”๋ฐ ํฐ ๋ถˆํŽธ์„ ๊ฒช๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ๋‹ค๋ฆฌ๋ฅผ ์ง“๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•˜์˜€๋‹ค. ๊ฐ• ์ฃผ๋ณ€์—์„œ ๋‹ค๋ฆฌ๋ฅผ ์ง“๊ธฐ์— ์ ํ•ฉํ•œ ๊ณณ์„ ์‚ฌ์ดํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ์žฌ์›์ด๋Š” ๊ฐ• ์ฃผ๋ณ€์„ ๋ฉด๋ฐ€ํžˆ ์กฐ์‚ฌํ•ด ๋ณธ ๊ฒฐ๊ณผ ๊ฐ•์˜ ์„œ์ชฝ์—๋Š” N๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๊ณ  ๋™์ชฝ์—๋Š” M๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. (N โ‰ค M)

์žฌ์›์ด๋Š” ์„œ์ชฝ์˜ ์‚ฌ์ดํŠธ์™€ ๋™์ชฝ์˜ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค๋ฆฌ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค. (์ด๋•Œ ํ•œ ์‚ฌ์ดํŠธ์—๋Š” ์ตœ๋Œ€ ํ•œ ๊ฐœ์˜ ๋‹ค๋ฆฌ๋งŒ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค.) ์žฌ์›์ด๋Š” ๋‹ค๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ง€์œผ๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ์ชฝ์˜ ์‚ฌ์ดํŠธ ๊ฐœ์ˆ˜๋งŒํผ (N๊ฐœ) ๋‹ค๋ฆฌ๋ฅผ ์ง€์œผ๋ ค๊ณ  ํ•œ๋‹ค. ๋‹ค๋ฆฌ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๊ฒน์ณ์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ํ•  ๋•Œ ๋‹ค๋ฆฌ๋ฅผ ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

์„œ์ชฝ ์ฒซ๋ฒˆ์งธ ์‚ฌ์ดํŠธ๊ฐ€ ๋™์ชฝ์˜ ์‚ฌ์ดํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด, ๋‚˜๋จธ์ง€๋Š” ๋™์ชฝ์˜ ๋‚จ์€ ์‚ฌ์ดํŠธ๋“ค ์ค‘ ์„œ์ชฝ์˜ ๋‚จ์€ ์‚ฌ์ดํŠธ๋“ค๋งŒํผ์„ ์กฐํ•ฉํ•˜์—ฌ ๊ฒฐ์ •๋œ๋‹ค.
์ฆ‰, nCm ๊ณผ ๊ฐ™์€ ์กฐํ•ฉ์ด ์‚ฌ์šฉ๋œ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” dp๋ฅผ ์ด์šฉํ•ด์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—,
nCm = n-1Cm + n-1Cm-1 ์„ ์ด์šฉํ•ด์„œ dp๋ผ๋Š” ๋”•์…”๋„ˆ๋ฆฌ์— ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ฃผ๋ฉฐ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ ๋”•์…”๋„ˆ๋ฆฌ์˜ ํ‚ค๊ฐ’์€ n,m ์— ํ•ด๋‹นํ•˜๋Š” ํŠœํ”Œ ๊ฐ’์œผ๋กœ ๋˜์–ด์žˆ๊ณ , return ์กฐ๊ฑด์€ n์ด๋‚˜ m์ด 0์ด๊ฑฐ๋‚˜ n๊ณผ m์ด ๊ฐ™์„ ๋•Œ 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

solution ์ฝ”๋“œ

import sys
sys.stdin = open("input.txt")
sys.setrecursionlimit(10 ** 7)
T = int(sys.stdin.readline())
dp = {}


def combi(n,m):
    if (n,m) in dp.keys():
        return dp[(n,m)]
    if n == 0 or m == 0 or n == m:
        dp[(n,m)] = 1
        return 1
    res = combi(n-1,m-1) + combi(n-1,m)
    dp[(n,m)] = res
    return res

for _ in range(T):
    n,m = map(int, sys.stdin.readline().split())
    sys.stdout.write(str(combi(m,n))+"\n")