[BOJ][๐ก5][๋ฐฑ์ค#14500] ํ ํธ๋ก๋ฏธ๋ ธ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํฌ๊ธฐ๊ฐ 1ร1์ธ ์ ์ฌ๊ฐํ์ ์ฌ๋ฌ ๊ฐ ์ด์ด์ ๋ถ์ธ ๋ํ์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
์ ์ฌ๊ฐํ์ ์๋ก ๊ฒน์น๋ฉด ์ ๋๋ค. ๋ํ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ์ ์ฌ๊ฐํ์ ๋ณ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ์ฆ, ๊ผญ์ง์ ๊ณผ ๊ผญ์ง์ ๋ง ๋ง๋ฟ์ ์์ผ๋ฉด ์ ๋๋ค.
์ ์ฌ๊ฐํ 4๊ฐ๋ฅผ ์ด์ด ๋ถ์ธ ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํ ํธ๋ก๋ฏธ๋ ธ๋ผ๊ณ ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง๊ฐ ์๋ค.
์๋ฆ์ด๋ ํฌ๊ธฐ๊ฐ NรM์ธ ์ข ์ด ์์ ํ ํธ๋ก๋ฏธ๋ ธ ํ๋๋ฅผ ๋์ผ๋ ค๊ณ ํ๋ค. ์ข ์ด๋ 1ร1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์นธ์๋ ์ ์๊ฐ ํ๋ ์ฐ์ฌ ์๋ค. ํ ํธ๋ก๋ฏธ๋ ธ ํ๋๋ฅผ ์ ์ ํ ๋์์ ํ ํธ๋ก๋ฏธ๋ ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ฌ ์๋ ์๋ค์ ํฉ์ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ํ ํธ๋ก๋ฏธ๋ ธ๋ ๋ฐ๋์ ํ ์ ์ฌ๊ฐํ์ด ์ ํํ ํ๋์ ์นธ์ ํฌํจํ๋๋ก ๋์์ผ ํ๋ฉฐ, ํ์ ์ด๋ ๋์นญ์ ์์ผ๋ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ข ์ด์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (4ย โค N, M โค 500) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ข ์ด์ ์ฐ์ฌ ์๋ ์๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ j๋ฒ์งธ ์๋ ์์์๋ถํฐ i๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ j๋ฒ์งธ ์นธ์ ์ฐ์ฌ ์๋ ์์ด๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์๋ 1,000์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ ํธ๋ก๋ฏธ๋ ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ธ ์๋ค์ ํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
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
์ถ๋ ฅ
19
์์ 2
์ ๋ ฅ
4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
์ถ๋ ฅ
20
์์ 3
์ ๋ ฅ
4 10
1 2 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2 1
1 2 1 2 1 2 1 2 1 2
2 1 2 1 2 1 2 1 2 1
์ถ๋ ฅ
7
My Sol
import sys
input = sys.stdin.readline
def main1(i, ni, nj, ssum):
global visited
if i==4:
global maxV
maxV = max(maxV, ssum)
return
for di, dj in didj:
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
if visited[si][sj]: continue
visited[si][sj] = 1
main1(i+1, si, sj, ssum+mat[si][sj])
visited[si][sj] = 0
def main2(ni, nj):
global maxV
arr = []
for di, dj in didj:
si, sj = ni+di, nj+dj
if not (0<=si<I and 0<=sj<J): continue
arr.append(mat[si][sj])
l = len(arr)
val = mat[ni][nj]
if l==4:
val += sum(arr) - min(arr)
maxV = max(maxV, val)
elif l==3:
val += sum(arr)
maxV = max(maxV, val)
return
I, J = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(I)]
visited = [[0]*J for _ in range(I)]
didj = ((-1,0),(1,0),(0,-1),(0,1))
maxV = 0
for i in range(I):
for j in range(J):
visited[i][j] = 1
main1(1, i, j, mat[i][j])
visited[i][j] = 0
main2(i, j)
print(maxV)
๋ชจ๋ ์นธ์ ๋ํ์ฌ ์์ ํ์์ ์ค์ํ์๋๋ฐ, ๋ชจ๋ ์นธ์ ๊ธฐ์ค์ ์ผ๋ก ์ผ์ ํ์์ ์์ํ๋ค. ใ ์ ๋ชจ์ ๋ธ๋ญ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ dfs๋ก ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ใ ์ ๋ชจ์์ ํ์ธํ๋ main2() ํจ์๋ฅผ ๋ถ๋ฆฌํ์ฌ ์์ฑํ์๊ณ , ๋๋จธ์ง๋ main1() ํจ์๋ก ์์ฑํ์๋ค.
๊น์ด๋ฅผ 4๊น์ง ํ์ฌ ์ด 4์นธ์ ํฉ์ ๊ณ์ฐํด ์ธ์๋ก ๋ฐ์ ์ ์๊ฒ ํ์์ผ๋ฉฐ, 4์นธ์ ํฉ์ ๊ตฌํ๋ค๋ฉด ์ ์ญ๋ณ์์ธ maxV์ ๋น๊ตํด ๋ ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ ์ ์๋๋ก ํ์๋ค.
ใ ์ ๋ชจ์์ ๊ฒฝ์ฐ ๋ฒ์ ๋ด์ ์ฌ๋ฐฉ์ ๊ฐ์ arr์ ๋ด๋๋ฐ, ๊ผญ์ง์ ์ ๋ฒ์ ๋ด์ ์ฌ๋ฐฉ์ ๊ฐ์๊ฐ 2๊ฐ์ด๋ฏ๋ก ใ ์๋ฅผ ๋ง๋ค ์ ์์ด ์ ์ธํ์๊ณ , ๋ณ์ ์์ด์ ์ฌ๋ฐฉ ์ค 3๊ฐ๋ง ์ทจํ ์ ์๋ค๋ฉด ๊ธฐ์ค์ ์ ๊ฐ๊ณผ ๋ํด maxV์ ๋น๊ตํ๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ๋ ์ฌ๋ฐฉ์ ๊ฐ์ด ๋ชจ๋ ์๋ ๊ฒฝ์ฐ์ผํ ๋ฐ, ์ด ์ฌ๋ฐฉ์ ๊ฐ ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ธํ๊ณ ๋๋จธ์ง 3๊ฐ๋ฅผ ๋ํด ๊ธฐ์ค์ ์ ๊ฐ๊ณผ ๋ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def dfs(x, y, depth, result):
global MAX
if depth == 4:
MAX = max(MAX, result)
return
if result + (4 - depth) * mNumber <= MAX:
return
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if 0 <= nx < n and 0 <= ny < m and not visit[nx][ny]:
visit[nx][ny] = True
dfs(nx, ny, depth + 1, result + graph[nx][ny])
visit[nx][ny] = False
if depth == 2:
visit[nx][ny] = True
dfs(x, y, depth + 1, result + graph[nx][ny])
visit[nx][ny] = False
mNumber = -1
for i in range(n):
mNumber = max(mNumber, max(graph[i]))
MAX = -1
visit = [[False] * m for _ in range(n)]
for x in range(n):
for y in range(m):
visit[x][y] = True
dfs(x, y, 1, graph[x][y])
visit[x][y] = False
print(MAX)
์ฐ์ฐ์๊ฐ์ด ๋ช ๋ฐฐ๋ ๋ ๋น ๋ฅธ ์ฝ๋๋ฅผ ์ฑ์ ํํฉ์์ ๋ฐ๊ฒฌํด์ ๋ถ์ํ์๋ค. ์ ์ฒด์์ ์ต๋๊ฐ์ mNumber๋ก ์ง์ ํ์๋๋ฐ, depth๋ง๋ค depth์ mNumber๋ฅผ ๊ณฑํ ๊ฐ๊ณผ result๋ฅผ ๋ํ ๊ฐ์ด MAX๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด returnํ์๋ค. mNumber๋ฅผ depth๋งํผ ๊ณฑํ ๊ฐ์ ๊ฐ์ฅ ์ปค์ผํ๋๋ฐ result๊ฐ ์ถฉ๋ถํ ํฌ์ง ์์ MAX๋ณด๋ค ์์์ง๋ค๋ฉด ์๋ฌด๋ฆฌ ๋ depth๋ฅผ ์งํํด๋ MAX๋ณด๋ค ์ปค์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋ ์งํํ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๊ฐ์ง์น๊ธฐ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ