DevYoon
[SWEA] 1949. ๋ฑ์ฐ๋ก ์กฐ์ฑ (Python) ๋ณธ๋ฌธ
link ๐ https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq
1๏ธโฃ ๋ฑ์ฐ๋ก๋ ๊ฐ์ฅ ๋์ ๋ด์ฐ๋ฆฌ์์ โก๏ธ Max ๊ฐ ๊ตฌํด์ฃผ๊ณ , ์ด์ค for๋ฌธ์ผ๋ก Max๊ฐ๊ณผ ๊ฐ๋ค๋ฉด dfs ๋๋ ค์ฃผ๊ธฐ
2๏ธโฃ ๊ฐ๋ก or ์ธ๋ก๋ก ์ด๋, ๋์ → ๋ฎ์ โก๏ธ ์ ํ ์ข ์ฐ, Branch 4
3๏ธโฃ ๋ฑ ํ ๊ณณ์ ์ ํด ์ต๋ ๊ณต์ฌ ๊ฐ๋ฅ ๊น์ด K๋งํผ โก๏ธ ์ฒ์์ K๋ณด๋ค ์์ผ๋ฉด ๋ฑ์ฐ๋ก๋ฅผ ์กฐ์ฑํ ์ ์๋ค๊ณ ์ดํดํ๋๋ฐ, ๋ฌธ์ ํ๋ฉด์ ์๋ชป ์ดํดํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
4๏ธโฃ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด ๊ธธ์ด โก๏ธ Max_length
๐ฅ ์ฃผ์
- ์ต๋ ๊ณต์ฌ ๊ฐ๋ฅ ๊น์ด K๋ K๋งํผ ๊น์ ์ ์๋ค๋ ๋ป์ด๋ค. ๊ฐ๋ น, 8์ธ ์ฐ์ ๊น์ผ๋ ค ํ๊ณ K๊ฐ 3์ด๋ผ๋ฉด 5๊น์ง๋ง ๊น์ ์ ์๋ ๊ฒ์ด๋ค.
def dfs(y, x, nowheight, cnt, check):
global Max_length
directy = [-1, 1, 0, 0]
directx = [0, 0, -1, 1]
for i in range(4):
dy = directy[i]+y
dx = directx[i]+x
if 0 <= dy < N and 0 <= dx < N:
if visit[dy][dx] == 1:continue # ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฉด X
if mountain[dy][dx] < nowheight: # ์ด๋ํ๋ ค๋ ์ฐ์ ๋์ด๊ฐ ํ์ฌ ์ฐ์ ๋์ด๋ณด๋ค ์์ผ๋ฉด
visit[dy][dx] = 1
dfs(dy, dx, mountain[dy][dx], cnt+1, check)
visit[dy][dx] = 0
else:
# ์ด๋ํ๋ ค๋ ์ฐ์ ๋์ด์์ ํ์ฌ ์ฐ์ ๋์ด๋ฅผ ๋บ ๊ฐ์ด ์ต๋ ๊ณต์ฌ ๊ฐ๋ฅ ๊น์ด๋ณด๋ค ์์์ผ ๋บ์ ๋ ์ด๋ ๊ฐ๋ฅ
if mountain[dy][dx]-nowheight < depth:
if check != 1: # ํ ์ ์์ผ๋ฉด
visit[dy][dx] = 1
dfs(dy, dx, nowheight-1, cnt+1, 1)
visit[dy][dx] = 0
if Max_length < cnt: # ๋ ์ด์ ๋ฑ์ฐ๋ก๋ฅผ ๊ณต์ฌํ ์ ์์ผ๋ฉด
Max_length = cnt # ์ต๋ ๊ธธ์ด ๋น๊ต ๋ฐ ๊ฐฑ์
return
t = int(input())
for tc in range(1, t+1):
N, depth = map(int, input().split()) # ํ ๋ณ์ ๊ธธ์ด, ์ต๋ ๊ณต์ฌ ๊ฐ๋ฅ ๊น์ด
mountain = [list(map(int, input().split())) for _ in range(N)]
visit = [[0]*N for _ in range(N)]
Max = -2e18
Max_length = -2e18
# Max ๊ฐ ์ฐพ์์ฃผ๊ธฐ
for i in range(N):
Max = max(Max, max(mountain[i]))
# Max์ ๊ฐ์ผ๋ฉด dfs ๋๋ ค์ค
for y in range(N):
for x in range(N):
if mountain[y][x] == Max:
visit[y][x] = 1
dfs(y, x, mountain[y][x], 1, 0) # y, x, ํ์ฌ ๋์ด, ๊ธธ์ด, ๊น์๋์ง
visit[y][x] = 0
print(f'#{tc} {Max_length}')