๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[BAEKJOON python] 14500_ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ๋ณธ๋ฌธ

๐Ÿฆฅ ์ฝ”ํ…Œ/BAEKJOON

[BAEKJOON python] 14500_ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

์ง•์ง•์•ŒํŒŒ์นด 2022. 10. 10. 21:52
728x90
๋ฐ˜์‘ํ˜•
ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ 1×1์ธ ์ •์‚ฌ๊ฐํ˜•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•
    ์ •์‚ฌ๊ฐํ˜•์€ ์„œ๋กœ ๊ฒน์น˜๋ฉด ์•ˆ ๋œ๋‹ค.
    ๋„ํ˜•์€ ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    ์ •์‚ฌ๊ฐํ˜•์˜ ๋ณ€๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ผญ์ง“์ ๊ณผ ๊ผญ์ง“์ ๋งŒ ๋งž๋‹ฟ์•„ ์žˆ์œผ๋ฉด ์•ˆ ๋œ๋‹ค.
    ์ •์‚ฌ๊ฐํ˜• 4๊ฐœ๋ฅผ ์ด์–ด ๋ถ™์ธ ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋Š” ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

์•„๋ฆ„์ด๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ข…์ด ์œ„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ํ•˜๋‚˜๋ฅผ ๋†“์œผ๋ ค๊ณ  ํ•œ๋‹ค.
์ข…์ด๋Š” 1×1 ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์นธ์—๋Š” ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์“ฐ์—ฌ ์žˆ๋‹ค.
ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ ํ•˜๋‚˜๋ฅผ ์ ์ ˆํžˆ ๋†“์•„์„œ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋“ค์˜ ํ•ฉ์„ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ

ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋Š” ๋ฐ˜๋“œ์‹œ ํ•œ ์ •์‚ฌ๊ฐํ˜•์ด ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์นธ์„ ํฌํ•จํ•˜๋„๋ก ๋†“์•„์•ผ ํ•˜๋ฉฐ, ํšŒ์ „์ด๋‚˜ ๋Œ€์นญ์„ ์‹œ์ผœ๋„ ๋œ๋‹ค.
์ฒซ์งธ ์ค„์— ์ข…์ด์˜ ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (4 ≤ N, M ≤ 500)
๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ข…์ด์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
i๋ฒˆ์งธ ์ค„์˜ j๋ฒˆ์งธ ์ˆ˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์นธ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ j๋ฒˆ์งธ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜
์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” 1,000์„ ๋„˜์ง€ ์•Š๋Š” ์ž์—ฐ์ˆ˜

์ฒซ์งธ ์ค„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๊ฐ€ ๋†“์ธ ์นธ์— ์“ฐ์ธ ์ˆ˜๋“ค์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
# 1) DFS
N, M = map(int, input().split())
graph = []
for i in range(N) :
    graph.append(list(map(int, input().split())))

max_val = max(map(max, graph))
visited = [[False] * M for _ in range(N)]

# ์ƒํ•˜์ขŒ์šฐ
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
result = 0

def dfs(x, y, step, total) :
    global result
    
    # ์ตœ๋Œ€๊ฐ’ ๋ชป ๋„˜๊ธฐ๋ฉด ์ข…๋ฃŒ
    if total + max_val * (4 - step) <= result :
        return
    
    # ๋ธ”๋ก 4๊ฐœ ๋‹ค์“ฐ๋ฉด ์ข…๋ฃŒ
    if step == 4 :
        result = max(result, total)
        return

    for i in range(4) :
        nx = x + dx[i]
        ny = y + dy[i]
        # ๋ฒ”์œ„๋‚ด ์žˆ๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
        if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny] :
            # ๋ธ”๋ก ์—ฐ๊ฒฐ ํ›„ ใ…, ใ…“, ใ…—, ใ…œ ๋ชจ์–‘ ๋งŒ๋“ค๊ธฐ
            if step == 2 :
                visited[nx][ny] = True      # ํƒ์ƒ‰ํ•จ
                dfs(x, y, step + 1, total+graph[nx][ny])
                visited[nx][ny] = False     # ํƒ์ƒ‰ ์ œ๊ฑฐ

            visited[nx][ny] = True
            dfs(nx, ny, step + 1, total+graph[nx][ny])
            visited[nx][ny] = False



for i in range(N) :
    for j in range(M) :
        visited[i][j] = True
        dfs(i, j, 1, graph[i][j])
        visited[i][j] = False
print(result)

# input
# 5 5
# 1 2 3 4 5
# 5 4 3 2 1
# 2 3 4 5 6
# 6 5 4 3 2
# 1 2 1 2 1

# output
# 19
 
728x90
๋ฐ˜์‘ํ˜•
Comments