ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [๋ฐฑ์ค€] 1520 ๋‚ด๋ฆฌ๋ง‰ ๊ธธ with Python
    PS 2022. 6. 10. 15:44
    728x90
    ๋ฐ˜์‘ํ˜•

    ๐Ÿ“Œ BOJ 1520 ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

    ๐Ÿ’ก ์กฐ๊ฑด

    1. ์ง€๋„๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.
      ํ•œ ์นธ์€ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ๊ฐ ์นธ์—๋Š” ๊ทธ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์“ฐ์—ฌ ์žˆ์œผ๋ฉฐ, ๊ฐ ์ง€์  ์‚ฌ์ด์˜ ์ด๋™์€ ์ง€๋„์—์„œ ์ƒํ•˜์ขŒ์šฐ ์ด์›ƒํ•œ ๊ณณ๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    1. ํ˜„์žฌ ์ œ์ผ ์™ผ์ชฝ ์œ„ ์นธ์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ง€์ ์— ์žˆ๋Š” ์„ธ์ค€์ด๋Š” ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ง€์ ์œผ๋กœ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.
      ๊ทธ๋Ÿฐ๋ฐ ๊ฐ€๋Šฅํ•œ ํž˜์„ ์ ๊ฒŒ ๋“ค์ด๊ณ  ์‹ถ์–ด ํ•ญ์ƒ ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์€ ์ง€์ ์œผ๋กœ๋งŒ ์ด๋™ํ•˜์—ฌ ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€ ๊ฐ€๊ณ ์ž ํ•œ๋‹ค.
      ์œ„์™€ ๊ฐ™์€ ์ง€๋„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    1. ์ง€๋„๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์ด์™€ ๊ฐ™์ด ์ œ์ผ ์™ผ์ชฝ ์œ„ ์ง€์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ง€์ ๊นŒ์ง€
      ํ•ญ์ƒ ๋‚ด๋ฆฌ๋ง‰๊ธธ๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
    1. ์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ์„ธ๋กœ์˜ ํฌ๊ธฐ M๊ณผ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ N์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.
      ์ด์–ด ๋‹ค์Œ M๊ฐœ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— N๊ฐœ์”ฉ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ฐ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.
      M๊ณผ N์€ ๊ฐ๊ฐ 500์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๊ณ , ๊ฐ ์ง€์ ์˜ ๋†’์ด๋Š” 10000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.
    1. ์ฒซ์งธ ์ค„์— ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์˜ ์ˆ˜ H๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋ชจ๋“  ์ž…๋ ฅ์— ๋Œ€ํ•˜์—ฌ H๋Š” 10์–ต ์ดํ•˜์˜ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜์ด๋‹ค.
    1. DFS, DP ์œ ํ˜•์˜ ๋ฌธ์ œ

    ๐Ÿ–ฅ ์†Œ์Šค ์ฝ”๋“œ

    from sys import stdin, setrecursionlimit
    setrecursionlimit(10 ** 6)
    
    n, m = map(int, stdin.readline().split())
    board = []
    for _ in range(n):
        board.append(list(map(int, stdin.readline().split())))
    
    dp = [[-1] * m for _ in range(n)]
    dx, dy = [1, 0, 0, -1], [0, -1, 1, 0]
    
    
    def solve(x, y):
        global ans
    
        if (x, y) == (n - 1, m - 1):
            return 1
    
        if dp[x][y] != -1:
            return dp[x][y]
    
        dp[x][y] = 0
    
        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if board[x][y] > board[nx][ny]:
                    dp[x][y] += solve(nx, ny)
    
        return dp[x][y]
    
    
    print(solve(0, 0))

    ๐Ÿ”– ์˜ˆ์ œ ๋ฐ ์‹คํ–‰๊ฒฐ๊ณผ

    ์˜ˆ์ œ

    4 5
    50 45 37 32 30
    35 50 40 20 25
    30 30 25 17 28
    27 24 22 15 10

    ์‹คํ–‰๊ฒฐ๊ณผ

    3

    โŒจ๏ธ ๋ฌธ์ œ ํ’€์ด

    1. ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์ง€์ ์€ DP[N][M] ์—์„œ, DP[N - 1][M] + DP[N][M - 1] ์ด๋‹ค.
    1. (0, 0)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ DFS๋กœ ์ง„ํ–‰์„ ํ•˜๋ฉด์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.
    1. DP์—๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ ๋‚˜์™”๋“ฏ์ด, ์ž…๋ ฅ๋ฐ›์€ board ์—์„œ ํ˜„์žฌ ์œ„์น˜ํ•œ ์œ„์น˜์˜ ๊ฐ’๋ณด๋‹ค
      ์ ์–ด์•ผ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— DFS ํ•จ์ˆ˜๋ฅผ ์ฝ”๋”ฉํ•  ๋•Œ ์กฐ๊ฑด๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค.
    1. ๋งŒ์•ฝ ๋ฐฉ๋ฌธ์ด ๋˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด DP ๋ฆฌ์ŠคํŠธ์— -1๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๊ฒŒ DP ๋ฆฌ์ŠคํŠธ๋ฅผ -1 ๋กœ ๋ชจ๋‘ ์ฑ„์›Œ์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
      ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๊ฐ€ ๋ฐฉ๋ฌธ์„ ์ด๋ฏธ ํ–ˆ๋˜ ๊ณณ์ด๋ผ๋ฉด ๋ฐ”๋กœ ํ˜„์žฌ ์ขŒํ‘œ์˜ DP ๋ฆฌ์ŠคํŠธ๋ฅผ return ํ•œ๋‹ค.
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.