Algorithm

[๋ฐฑ์ค€] 1937. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 1937๋ฒˆ ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

๐Ÿ• ๋ฌธ์ œ

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

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

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

  1. ๋จผ์ €, ์ž…๋ ฅ์„ ๋‹ค ๋ฐ›๊ณ  ๋‚œ ๋’ค check๋ผ๋Š” ์ด๋™๊ฐ’์„ ์ €์žฅํ•ด์ค„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•œ๋‹ค. ์ด check ์—๋Š” ํŠน์ • [i][j] ์นธ๊นŒ์ง€์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. ์ƒ ํ•˜ ์ขŒ ์šฐ, ๋” ํฐ ๊ฐ’์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์ด์ „ check๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ update๋ฅผ ํ•ด์ค€๋‹ค.
    ์ด ๋•Œ, ๋‹จ์ˆœํžˆ +1์„ ํ•˜๊ณ  dfs๋ฅผ ๊ณ„์† ๋Œ๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” dp์Šค๋Ÿฝ๊ฒŒ ํ’€์–ด์•ผํ•˜๋ฏ€๋กœ, ๋‹จ์ˆœํžˆ +1์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํ˜„์žฌ์˜ check ๊ฐ’๊ณผ, ๋ฐ”๋€ ์ธ๋ฑ์Šค๋กœ dfs ๋Œ๊ณ  ๋‚œ ์ดํ›„์˜ check๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
    ์ด๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ด๊ธฐ๋„ ํ•œ๋ฐ, dp๋กœ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” dfs๋ฅผ ํƒ์ƒ‰์šฉ์ด ์•„๋‹Œ, ํ˜„์žฌ ์œ„์น˜์˜ check ๊ฐ’์„ ์ฐพ์•„๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. check์— ๊ฐ€์žฅ ์•Œ๋งž์€ ๊ฐ’์ด ์ €์žฅ๋œ ๋’ค ๋” ์ด์ƒ ๊ฐˆ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น check ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  4. check ๋ฐฐ์—ด์— ๊ฐ€์žฅ ํฐ ๊ฐ’์„ printํ•œ๋‹ค.

solution ์ฝ”๋“œ

import sys
sys.setrecursionlimit(10 ** 5)
sys.stdin = open("input.txt","rt")

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def dfs(x,y):
    if check[x][y]: #์ฒดํฌ๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ (์ด๋ฏธ ๋‹ค๋…€์˜จ ๊ฒฝ์šฐ)
        return check[x][y] #์ฒดํฌ๋ฅผ ๋ฆฌํ„ดํ•ด์คŒ.
    check[x][y] = 1 # ์ฒดํฌ๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ์ฒดํฌ๋ฅผ 1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์คŒ.
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # ๋ฒ”์œ„์— ์•Œ๋งž์€ nx,ny์— ๋Œ€ํ•˜์—ฌ ๋Œ€๋‚˜๋ฌด๊ฐœ์ˆ˜๋„ ๋” ๋งŽ๋‹ค๋ฉด,
        if 0 <= nx < n and 0 <= ny < n and forest[x][y] < forest[nx][ny]:
            # ํ•ด๋‹น ์ฒดํฌ์— ๊ธฐ์กด์˜ ์ฒดํฌ์™€, dfs๋ฅผ ๋Œ๊ณ  ๋‚œ ๋’ค์˜ ์ฒดํฌ๊ฐ’์— +1 ํ•œ ๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’์„ ์ €์žฅ
            # 1์„ ๋”ํ•˜๋Š” ์ด์œ ๋Š” ๊ธฐ์กด ๊ฐ’์—์„œ ๋” ๋‚˜์•„๊ฐ„ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ํ•œ์นธ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
            check[x][y] = max(check[x][y], dfs(nx,ny) + 1)
    return check[x][y]


n = int(sys.stdin.readline())
forest = []
for _ in range(n):
    forest.append(list(map(int,sys.stdin.readline().split())))

check = [[0] * n for _ in range(n)]

for i in range(n):
    for j in range(n):
        check[i][j] = dfs(i,j) # ์ฒดํฌ ๋ฐฐ์—ด์—, dfs๋ฅผ ํ†ตํ•ด ์–ป์€ ํ•ด๋‹น ์ฒดํฌ์˜ ๊ฐ’์„ ์ €์žฅ.
print(max(map(max,check)))

์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ

import sys
sys.setrecursionlimit(10 ** 5)
sys.stdin = open("input.txt","rt")

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def dfs(x,y):
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < n and 0 <= ny < n and forest[x][y] < forest[nx][ny]:
            if check[nx][ny] == 1 or check[x][y] + 1 > check[nx][ny]:
                check[nx][ny] = check[x][y] + 1
                dfs(nx, ny)


n = int(sys.stdin.readline())
forest = []
for _ in range(n):
    forest.append(list(map(int,sys.stdin.readline().split())))

check = [[1] * n for _ in range(n)]

for i in range(n):
    for j in range(n):
        if check[i][j] == 1:
            dfs(i,j)

res = 0
for i in range(n):
    comp = max(check[i])
    res = comp if res < comp else res

print(res)