[BOJ][๐ŸŸก3][๋ฐฑ์ค€#01937] ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

์ž‘์„ฑ:    

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

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

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1937


๋ฌธ์ œ

n ร— n์˜ ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋Š” ์–ด๋–ค ์ง€์—ญ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณณ์˜ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋‹ค ๋จน์–ด ์น˜์šฐ๋ฉด ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ทธ๊ณณ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹จ ์กฐ๊ฑด์ด ์žˆ๋‹ค. ์ด ํŒ๋‹ค๋Š” ๋งค์šฐ ์š•์‹ฌ์ด ๋งŽ์•„์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ณ  ์ž๋ฆฌ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์˜ฎ๊ธด ์ง€์—ญ์— ๊ทธ ์ „ ์ง€์—ญ๋ณด๋‹ค ๋Œ€๋‚˜๋ฌด๊ฐ€ ๋งŽ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŒ๋‹ค์˜ ์‚ฌ์œก์‚ฌ๋Š” ์ด๋Ÿฐ ํŒ๋‹ค๋ฅผ ๋Œ€๋‚˜๋ฌด ์ˆฒ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๋Š”๋ฐ, ์–ด๋–ค ์ง€์ ์— ์ฒ˜์Œ์— ํ’€์–ด ๋†“์•„์•ผ ํ•˜๊ณ , ์–ด๋–ค ๊ณณ์œผ๋กœ ์ด๋™์„ ์‹œ์ผœ์•ผ ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นธ์„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผ์— ๋น ์ ธ ์žˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์ด ์‚ฌ์œก์‚ฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. n ร— n ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์ฃผ์–ด์ ธ ์žˆ์„ ๋•Œ, ์ด ํŒ๋‹ค๊ฐ€ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์นธ์„ ์ด๋™ํ•˜๋ ค๋ฉด ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•˜์—ฌ ์›€์ง์—ฌ์•ผ ํ•˜๋Š”์ง€ ๊ตฌํ•˜์—ฌ๋ผ.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ํฌ๊ธฐ n(1 โ‰ค n โ‰ค 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด ์ˆฒ์˜ ์ •๋ณด๋Š” ๊ณต๋ฐฑ์„ ์‚ฌ์ด๋กœ ๋‘๊ณ  ๊ฐ ์ง€์—ญ์˜ ๋Œ€๋‚˜๋ฌด์˜ ์–‘์ด ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋Œ€๋‚˜๋ฌด์˜ ์–‘์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ํŒ๋‹ค๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์˜ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

4
14 9 12 10
1 11 5 4
7 15 2 13
6 3 16 8


์ถœ๋ ฅ

4


My Sol

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

def check_around(i, j):
    global dp, N, visit
    if dp[i][j]: return dp[i][j]
    visit[i][j] = 1

    cur, flag = 0, 0
    for di, dj in ((-1,0),(1,0),(0,1),(0,-1)):
        si, sj = i+di, j+dj
        if not (0<=si<N and 0<=sj<N): continue
        if mat[i][j] >= mat[si][sj]: continue
        if dp[si][sj]:
            flag = 1
            if cur < dp[si][sj]:
                cur = dp[si][sj]
            continue

        if visit[si][sj]: continue

        check_cnt = check_around(si, sj)
        if check_cnt: flag = 1
        if cur < check_cnt:
            cur = check_cnt
    dp[i][j] = cur+1 if (cur or flag) else -1
    return dp[i][j]

N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
dp = [[0]*N for _ in range(N)]
visit = [[0]*N for _ in range(N)]

maxx = 0
for i in range(N):
    for j in range(N):
        ret = check_around(i, j)
        if maxx < ret:
            maxx = ret

print(maxx+1)

DP๋ฅผ ํ™œ์šฉํ•ด ํ‘ธ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ฃผ๋ณ€์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•˜๋Š” DP 2์ฐจ์› ๋ฐฐ์—ด์„ DFS๋ฅผ ์ด์šฉํ•ด ์ฑ„์›Œ๋„ฃ๊ณ  ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค.

  1. ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. ๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด ์™„์ „ํƒ์ƒ‰์„ ์‹ค์‹œํ•œ๋‹ค. dp ๋ฐฐ์—ด์— ํ•ด๋‹น ์ขŒํ‘œ๊ฐ€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์กฐํšŒํ•˜๋Š” ๊ฒƒ
  3. ๋งŒ์•ฝ dp ๋ฐฐ์—ด์— ํ•ด๋‹น ์ขŒํ‘œ์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด ์ฃผ๋ณ€์„ ํƒ์ƒ‰ํ•ด์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์˜ ์ˆ˜+1์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ฃผ๋ณ€์— ์ด๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด -1์„ dp์— ์ฑ„์›Œ๋„ฃ๋Š”๋‹ค.
  4. ์žฌ๊ท€์™€ DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์‹ค์ƒ ์ƒํ•˜์ขŒ์šฐ ์ฃผ๋ณ€์„ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์กฐํšŒํ•ด์„œ ํ˜„์žฌ ์ขŒํ‘œ์—์„œ์˜ dp๊ฐ’์„ ๊ฒฐ์ •ํ•œ๋‹ค.
  5. ์ „์ฒด dp ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์™„์ „ํƒ์ƒ‰ ์ค‘์— maxx์— ๊ธฐ๋กํ•˜์—ฌ maxx+1 ์„ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

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

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