Algorithm Problem/Python

[python] λ°±μ€€ - 2225. ν•©λΆ„ν•΄

deo2kim 2020. 9. 22. 20:41
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

G5 | dp, μ‘°ν•©λ‘ 

DPλŠ” μ—­μ‹œ μ†μœΌλ‘œ ν•΄μ•Ό μ œλ§›μ΄λ‹€.

μ˜ˆμ‹œμ˜ 20, 2λŠ” λ„ˆλ¬΄ 크기 λ•Œλ¬Έμ— 6, 4둜 λ°”κΏ”μ„œ ꡬ해봀닀.

열은 N 행은 K이닀.

즉 2μ—΄ 3행은 2λ₯Ό 숫자 3개둜 λ§Œλ“œλŠ” λ°©λ²•μ˜ κ°€μ§“μˆ˜λ‹€.

λ”± 보면 κ·œμΉ™μ΄ 보일 것이닀. i, j λŠ” i-1,j 와 i,j-1의 ν•©μ΄λΌλŠ” 것을...

 

μ›λž˜μ˜ κ·œμΉ™μ€ 경우의 수λ₯Ό λͺ¨λ‘ 직접 ꡬ해보면 3μ—΄4행을 ꡬ할 λ•ŒλŠ” 3ν–‰μ˜ 0~4μ—΄κΉŒμ§€μ˜ 숫자λ₯Ό λ”ν•œ 값이닀.

κ·Έ μ΄μœ λŠ”

  • 0을 숫자 2개둜: (0,0)
  • 1을 숫자 2개둜: (0,1), (1,0)
  • 2λ₯Ό 숫자 2개둜: (0,2), (1,1), (2,0)

각각의 경우의 수 뒀에 2, 1, 0 을 λΆ™μ—¬μ£Όλ©΄ 숫자 2λ₯Ό 3개둜 κ΅¬μ„±ν•˜λŠ” 경우의 μˆ˜λŠ” 6이 λ‚˜μ˜¨λ‹€.

 

πŸ’¨

πŸ’»μ†ŒμŠ€ μ½”λ“œ

N, K = map(int, input().split())

dp = [[0] * (N + 1) for _ in range(K + 1)]

for i in range(1, K + 1):
    for j in range(N + 1):
        if j == 0:
            dp[i][j] = 1
        else:
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % 1000000000

    for row in dp:
        print(row)
    print()
print(dp[-1][-1])

 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

링크: https://www.acmicpc.net/problem/2225

 

2225번: ν•©λΆ„ν•΄

첫째 쀄에 닡을 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net


문제

0λΆ€ν„° NκΉŒμ§€μ˜ μ •μˆ˜ K개λ₯Ό λ”ν•΄μ„œ κ·Έ 합이 N이 λ˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λ§μ…ˆμ˜ μˆœμ„œκ°€ 바뀐 κ²½μš°λŠ” λ‹€λ₯Έ 경우둜 μ„Όλ‹€(1+2와 2+1은 μ„œλ‘œ λ‹€λ₯Έ 경우). λ˜ν•œ ν•œ 개의 수λ₯Ό μ—¬λŸ¬ 번 μ“Έ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)κ°€ 주어진닀.

좜λ ₯

첫째 쀄에 닡을 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

λ°˜μ‘ν˜•