[BOJ][๐ŸŸก5][๋ฐฑ์ค€#23083] ๊ฟ€๋ฒŒ ์Šน์—ฐ์ด

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #23083


๋ฌธ์ œ

์ด์„ธ๊ณ„์˜ ์Šน์—ฐ์ด๋Š” ๊ฟ€๋ฒŒ์ด๋‹ค. ์Šน์—ฐ์ด๊ฐ€ ์‚ฌ๋Š” ๋ฒŒ์ง‘์€ ์กฐ๊ธˆ ํŠน์ดํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค. ๋ฒŒ์ง‘์€ (N)ํ–‰ (M)์—ด์˜ ๊ฒฉ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ์นธ์€ ์ •์œก๊ฐํ˜• ๋ชจ์–‘์ด๋‹ค. ๊ฐ™์€ ํ–‰์— ์œ„์น˜ํ•œย ๋‘ ์นธ์„ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์ง์ˆ˜ ๋ฒˆ์งธ ์—ด์˜ ์นธ์€ ํ™€์ˆ˜ ๋ฒˆ์งธ ์—ด์˜ ์นธ๋ณด๋‹ค ๋ฐ˜ ์นธ ์•„๋ž˜์— ์œ„์น˜ํ•ด ์žˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์€ 3ํ–‰ 4์—ด์˜ ๊ฒฉ์ž๋กœ ์ด๋ฃจ์–ด์ง„ย ๋ฒŒ์ง‘์˜ ์˜ˆ์‹œ์ด๋‹ค.

๋‘ ์œก๊ฐํ˜• ์นธ์ด ํ•˜๋‚˜์˜ ๋ณ€์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์„œ๋กœ ์ธ์ ‘ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. ์œก๊ฐํ˜• ์นธ์˜ ๊ฐ ๋ณ€์—๋Š” ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ด ์žˆ๋Š”๋ฐ, ๋ฒŒ์ง‘ ๋‚ด ๊ตํ†ต ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ฐ ์นธ์—์„œ๋Š” ์•„๋ž˜์ชฝ, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ย ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜, ๋ฒŒ์ง‘์—๋Š” ๊ตฌ๋ฉ ์นธ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ,ย ๊ตฌ๋ฉ ์นธ์œผ๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ์Šน์—ฐ์ด๋Š” ์ตœ๊ทผ ๊ฟ€๋ฒŒ๋“ค ์‚ฌ์ด์— ๊ธ‰์†๋„๋กœ ์ „์—ผ๋˜๊ณ  ์žˆ๋Š” ๋ณ€์ด ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฒŒ์ง‘์ฝ• ์ƒํ™œ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์‹ฌ์‹ฌํ•จ์ด ๊ทน์— ๋‹ฌํ•œ ์Šน์—ฐ์ด๋Š” ๋ฒŒ์ง‘์˜ (1)ํ–‰ (1)์—ด ์นธ์—์„œ (N)ํ–‰ (M)์—ดย ์นธ๊นŒ์ง€ ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š๊ณ  ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์•Œ๊ณ  ์‹ถ์–ด ์กŒ๋‹ค. ์ž๊ฐ€ ๊ฒฉ๋ฆฌ ์ค‘์ธ ์Šน์—ฐ์ด๊ฐ€ ๋” ์ด์ƒ ๋‹ต๋‹ตํ•˜์ง€ ์•Š๋„๋ก ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ ์•Œ๋ ค์ฃผ์ž!


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— (N), (M)์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„์—๋Š” ๊ตฌ๋ฉ ์นธ์˜ ๊ฐœ์ˆ˜ (K)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด์„œ (K)๊ฐœ ์ค„์— ๊ตฌ๋ฉ ์นธ์˜ ์ •๋ณด (x_i), (y_i)๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” (i)๋ฒˆ์งธ ๊ตฌ๋ฉ ์นธ์ด (x_i)ํ–‰ (y_i)์—ด์— ์กด์žฌํ•จ์„ ๋œปํ•œ๋‹ค. ๋ชจ๋“  ๊ตฌ๋ฉ ์นธ์˜ ์œ„์น˜๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. (1)ํ–‰ (1)์—ด ์นธ ๋˜๋Š” (N)ํ–‰ (M)์—ด ์นธ์ด ๊ตฌ๋ฉ์ธ ๊ฒฝ์šฐ๋Š” ์—†์Œ์ด ๋ณด์žฅ๋œ๋‹ค.


์ถœ๋ ฅ

๋ฒŒ์ง‘์˜ (1)ํ–‰ (1)์—ด ์นธ์—์„œ (N)ํ–‰ (M)์—ด ์นธ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ (10^9+7)๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์ œํ•œ

2 โ‰ค (N) โ‰ค 1,000 2 โ‰ค (M) โ‰ค 1,000 0 โ‰ค (K) โ‰ค min((NM) - 2, 104) 1 โ‰ค (x_i) โ‰ค (N) 1 โ‰ค (y_i)ย โ‰ค (M)


์˜ˆ์ œ

์ž…๋ ฅ

3 4
1
2 3


์ถœ๋ ฅ

20


My Sol

import sys
input = sys.stdin.readline
sys.setrecursionlimit(300000)

def main():
    def make_holes():
        K = int(input())
        for _ in range(K):
            i, j = map(int, input().split())
            dp[i][j] = 0

    def find_dp(i, j):
        if dp[i][j] != -1: return dp[i][j]
        val = find_dp(i-1, j)+find_dp(i, j-1)
        val += find_dp(i-1, j-1) if j%2 else find_dp(i+1, j-1)
        dp[i][j] = int(val%X)
        return dp[i][j]

    X = 1e9+7
    I, J = map(int, input().split())
    dp = [[-1]*(J+1) for _ in range(I+2)]
    dp[1][1] = 1
    for i in range(I+1):
        dp[i][0] = 0
    for j in range(J+1):
        dp[0][j] = 0
        dp[I+1][j] = 0
    make_holes()
    return find_dp(I, J)

print(main())

DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๊ณจ๋“œ5 DP๋ฌธ์ œ์น˜๊ณ ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ ์ด์Šˆ๋กœ ์ตœ์ ํ™”๋ฅผ ์ตœ๋Œ€ํ•œ ํ•œ ๋’ค์—์•ผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊นŒ๋‹ค๋กœ์šด ๋ฌธ์ œ์˜€๋‹ค.

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ dp 2์ฐจ์› ๋ฐฐ์—ด์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŽธ์ธ๋ฐ, ๊ฒฝ๊ณ„๊ฐ’์—์„œ ๋ฐ”๋กœ 0์„ returnํ•˜๋Š” ๊ฒƒ์„ ๋ฒ”์œ„ ์กฐ๊ฑด์ด ์•„๋‹Œ ์ดˆ๊ธฐํ™” ๊ฐ’์ด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๊ฒฝ๊ณ„๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ข…๋ฃŒ ์กฐ๊ฑด์œผ๋กœ ํ•˜์˜€๋‹ค.
  2. (1, 1) ์ขŒํ‘œ๋ฅผ 1๋กœ ๋‘๊ณ , dp๋Š” (I, J)๋ถ€ํ„ฐ ์กฐํšŒํ•ด์„œ ์ค„์—ฌ๋‚˜๊ฐ„๋‹ค. ์ด๋ฅผ find_dp ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด์„œ memoizationํ•˜์˜€๋‹ค.
  3. dp[i][j]์— ๊ฐ’์ด ์ดˆ๊ธฐ๊ฐ’์ธ -1์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฐ”๋กœ returnํ•˜๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น ์ขŒํ‘œ๊นŒ์ง€ ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜ dp[i-1][j], dp[i][j-1]๋ฅผ ๋”ํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์— ๋ฒŒ์ง‘ ๋ชจ์–‘ ๊ณ„์‚ฐ์˜ ๊ด€๊ฑด์ธ j์—ด์˜ ํ™€์ง ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ dp[i-1][j-1] ๋˜๋Š” dp[i+1][j-1]๋ฅผ ๋”ํ•ด์ค€ ๋’ค dp ๋ฐฐ์—ด์— memoizationํ•œ ๋’ค ๋ฐ˜ํ™˜ํ•œ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ