ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 14494 λ‹€μ΄λ‚˜λ―Ήμ΄ λ­μ˜ˆμš”? with Python
    PS 2022. 7. 14. 23:07
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 14494 λ‹€μ΄λ‚˜λ―Ήμ΄ λ­μ˜ˆμš”?

    πŸ’‘ 쑰건

    1. λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°(동적 κ³„νšλ²•), λ‹€μ΄λ‚˜λ―Ήμ€ 이름이 μ—„μ²­ κ±°μ°½ν•˜μ§€λ§Œ 사싀 이름에 λΉ„ν•΄ κ°œλ…μ€ κ°„λ‹¨ν•˜λ‹€.
    1. λ‹€μ΄λ‚˜λ―Ήμ˜ κΈ°λ³Έ μ•„μ΄λ””μ–΄λŠ” λ°”λ‘œ 이전에 κ³„μ‚°ν•œ 값을 μ‚¬μš©ν•΄μ„œ (= 이미 κ³„μ‚°λœ 값을 μ‚¬μš©ν•΄μ„œ, μ–΄λ €μš΄ 말둜 λ©”λͺ¨μ΄μ œμ΄μ…˜.)
      λ°˜λ³΅λ˜λŠ” λ˜‘κ°™μ€ μ—°μ‚° 횟수λ₯Ό μ€„μ΄λŠ” 것.
    1. 닀차원 λ°°μ—΄λ‘œλ„ κ°€λŠ₯ν•˜λ‹€. 였λ₯Έμͺ½, μ•„λž˜μͺ½μœΌλ‘œλ§Œ 움직일 수 μžˆμ„ λ•Œ,
      D[1][1]μ—μ„œ D[x][y]κΉŒμ§€ λ„λ‹¬ν•˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œλŠ” 일일히 λͺ¨λ“  경우λ₯Ό λ‹€ 계산할 ν•„μš” 없이,
      D[i][j] = (i, j)에 λ„λ‹¬ν•˜λŠ” λˆ„μ  경우의 수 = D[i-1][j] + D[i][j-1]λ₯Ό μ„Έμ›Œμ„œ ν•΄κ²°ν•  μˆ˜λ„ μžˆλ‹€.
    1. β†’, ↓, β†˜μ˜ μ„Έ λ°©ν–₯만 μ‚¬μš©ν•΄μ„œ ν•œ λ²ˆμ— ν•œ μΉΈμ”© 이동할 λ•Œ, μ™Όμͺ½ μœ„
      (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ 였λ₯Έμͺ½ μ•„λž˜ (n, m)에 λ„μ°©ν•˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 문제.
      (1 ≀ n, m ≀ 1,000)
    1. 경우의 μˆ˜κ°€ μ—„μ²­ 컀질 수 μžˆμœΌλ―€λ‘œ 경우의 수λ₯Ό 1,000,000,007(=109+7)둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.
    1. DP μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    
    n, m = map(int, stdin.readline().split())
    dp = [[0] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 1
    
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            dp[i][j] = (dp[i-1][j] + dp[i][j-1] + dp[i-1][j-1]) % (int(1e9) + 7)
    
    print(dp[n][m])

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    4 5

    μ‹€ν–‰κ²°κ³Ό

    129

    ⌨️ 문제 풀이

    1. 이번 λ¬Έμ œλŠ” λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έν˜•μ΄λΌκ³  μƒκ°ν•˜κ³  ν’€μ΄ν•΄λ³΄μ•˜λ‹€.
    1. λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 것은 (1, 1)λΆ€ν„° (N, M)κΉŒμ§€ λ„λ‹¬ν•˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 것이닀.
    1. (N * M) 크기의 2차원 배열을 DP 라고 ν•œλ‹€λ©΄, 이 λ¬Έμ œμ—μ„œ λ°”λΌλŠ” 값은 DP[N][M]에 μžˆμ„ 것이닀.
    1. (3)λ²ˆμ—μ„œ κ΅¬ν•˜λ €λŠ” DP[N][M] 의 값은 각각 DP[N-1][M], DP[N][M-1], DP[N-1][M-1] 의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.
      DP[N-1][M] λ˜ν•œ DP[N-2][M], DP[N-1][M-1], DP[N-2][M-2] 의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.
    1. 이에 λ”°λΌμ„œ 점화식은 DP[i][j] = (DP[i-1][j], DP[i][j-1], DP[i-1][j-1]) 이닀.
    1. 이λ₯Ό int(1e9) + 7 둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό dp에 μ €μž₯ν•œλ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.