๋ถ๋ ธ์ ํ ํธ๋ฆฌ์ค..
๋จธ๋ฆฌ๊ฐ ๋์๋ฉด ๋ชธ์ด ๊ณ ์ํ๋ค
๐ผ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/14500
14500๋ฒ: ํ ํธ๋ก๋ฏธ๋ ธ
ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํฌ๊ธฐ๊ฐ 1×1์ธ ์ ์ฌ๊ฐํ์ ์ฌ๋ฌ ๊ฐ ์ด์ด์ ๋ถ์ธ ๋ํ์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค. ์ ์ฌ๊ฐํ์ ์๋ก ๊ฒน์น๋ฉด ์ ๋๋ค. ๋ํ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ์ ์ฌ๊ฐํ์ ๋ณ
www.acmicpc.net
- ํฐ์ด: ๊ณจ๋ IV
- ๋ถ๋ฅ: ๊ตฌํ, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
โ TRIAL 1.
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
line = list(map(int, input().split()))
paper.append(line)
totalmax = max(totalmax, max(line))
def solution(init_i, init_j, N, M):
maxval = 0
dis = [1, -1, 0, 0]
djs = [0, 0, 1, -1]
queue = deque([([(init_i, init_j)], paper[init_i][init_j])])
while queue:
path, ctr = queue.popleft()
i, j = path[-1]
for di, dj in zip(dis, djs):
new_i, new_j = i+di, j+dj
if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
if len(path) == 3:
maxval = max(maxval, new_val)
else:
queue.append((new_path, new_val))
T_shapes = [
[(0, -1), (0, 1), (1, 0)], #ใ
[(0, -1), (0, 1), (-1, 0)], #ใ
[(-1, 0), (1, 0), (0, 1)], #ใ
[(-1, 0), (1, 0), (0, -1)], #ใ
]
for center_di, center_dj in zip(dis+[0], djs+[0]):
center_i, center_j = init_i+center_di, init_j+center_dj
if 0<=center_i<N and 0<=center_j<M:
center_val = paper[center_i][center_j]
for T_d in T_ds:
T_sum = center_val
for di, dj in T_d:
adj_i, adj_j = center_i+di, center_j+dj
if not (0<=adj_i<N and 0<=adj_j<M):
break
T_sum += paper[adj_i][adj_j]
maxval = max(maxval, T_sum)
return maxval
maxval = totalmax+3
for i in range(N):
for j in range(M):
if paper[i][j]*4 > maxval:
maxval = max(maxval, solution(i, j, N, M))
print(maxval)
์ฝ๋ ์ค๋ช
- ์ฐ์ ๋ชจ๋ ํฌ์ธํธ์ ๋ํด ๊ฒ์ฌํ์ง๋ ์๊ณ , ํ์ฌ ํฌ์ธํธ ๊ฐ * 4 > ํ์ฌ ์ต๋๊ฐ ์ธ ๊ฒฝ์ฐ์๋ง ๊ฒ์ฌ๋ฅผ ์งํํ๋ค. ์ด ๊ฒ์ฌ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํจ.
- ์ด๊ธฐ ์ต๋๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์ ๋ ฅ๋ฐ์ ๊ฐ๋ค์ ๋ํด ์ต๋๊ฐ์ ๊ตฌํ๊ณ , ๊ฑฐ๊ธฐ์ 3์ ๋ํ ๊ฐ์ ์ด๊ธฐ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ค. (๋ชจ๋ ๊ฐ์ด ์์ฐ์๋ผ๋ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก)
- T์๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ BFS๋ก ๊ตฌํ๊ณ , T์๋ ๋ฐ๋ก ๋นผ์ ๊ตฌํจ
ํ๋ฆฐ ์์ธ
ํ๋ฆผ. T์์์ ๊ฐ์ด๋ฐ๊ฐ ์ต๋๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์ง๋์นจ
๋ฐ๋ก:
4 4
1 1 1 1
1 2 1 1
1 2 9 1
1 2 1 1
โ TRIAL 2.
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
line = list(map(int, input().split()))
paper.append(line)
totalmax = max(totalmax, max(line))
def solution_BFS(init_i, init_j, N, M):
maxval = 0
dis = [1, -1, 0, 0]
djs = [0, 0, 1, -1]
queue = deque([( [(init_i, init_j)], paper[init_i][init_j] )]) #path, val
while queue:
path, val = queue.popleft()
i, j = path[-1]
for di, dj in zip(dis, djs):
new_i, new_j = i+di, j+dj
if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
if len(new_path) == 4:
maxval = max(maxval, new_val)
else:
queue.append((new_path, new_val))
return maxval
def solution_T(init_i, init_j, N, M):
maxval = 0
T_shapes = [
[(0, -1), (0, 1), (1, 0)], #ใ
[(0, -1), (0, 1), (-1, 0)], #ใ
[(-1, 0), (1, 0), (0, 1)], #ใ
[(-1, 0), (1, 0), (0, -1)], #ใ
]
dis = [1, -1, 0, 0]
djs = [0, 0, 1, -1]
for center_di, center_dj in zip(dis+[0], djs+[0]):
center_i, center_j = init_i+center_di, init_j+center_dj
if 0<=center_i<N and 0<=center_j<M:
center_val = paper[center_i][center_j]
for T_adj in T_shapes:
T_val = center_val
for di, dj in T_adj:
adj_i, adj_j = center_i+di, center_j+dj
if not (0<=adj_i<N and 0<=adj_j<M):
break
T_val += paper[adj_i][adj_j]
maxval = max(maxval, T_val)
return maxval
maxval = totalmax+3
for i in range(N):
for j in range(M):
if paper[i][j]*4 > maxval:
maxval = max(maxval, solution_BFS(i, j, N, M), solution_T(i, j, N, M))
print(maxval)
์์ ํ ๋ถ๋ถ
- ์ผ๋จ BFS ๋ถ๋ถ๊ณผ T ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ.
- T ๋ถ๋ถ๋ง ์์ ํ์.
- init_i, init_j๋ฅผ ํฌํจํ๋ T์ํํ๋ง ๊ฒ์ฌํ ๊น ํ๋ค๊ฐ ๋์ ํ ์ฝ๋๋ฅผ ๋ชป์ง๊ฒ ์ด์ ๊ทธ๋ฅ init_i, init_j ํฌํจ ์ํ์ข์ฐ ์ขํ์ ๋ํด T์๋ฅผ ๊ฒ์ฌํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐ
ํ๋ฆฐ ์์ธ
ํ๋ฆผ. BFS๋ก ํ์ํ๋ T์๊ฐ ์๋ ๋ค๋ฅธ ๋ชจ์์์๋ ๋งจ ๋์ด ์๋ ๋ถ๋ถ์ ์ต๋๊ฐ์ด ์์นํ ์๋ ์๋ค..
๋ฐ๋ก:
4 4
1 2 1 1
1 9 1 1
1 2 1 1
1 2 1 1
๊ฒ์ฌํ๋ ํฌ์ธํธ์ ์ํ์ข์ฐ์ ๋ํด ๋์ผํ ๊ฒ์ฌํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ํ๋๋ฐ
๊ทธ๋ ๊ฒ ํ๋ฉด ์ค๋ณต์ผ๋ก ๊ฒ์ฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌด ๋ง์์ง
๐ก Solution
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
N, M = list(map(int, input().split()))
paper = []
totalmax = 0
for _ in range(N):
line = list(map(int, input().split()))
paper.append(line)
totalmax = max(totalmax, max(line))
def solution_BFS(init_i, init_j, N, M):
maxval = 0
dis = [1, -1, 0, 0]
djs = [0, 0, 1, -1]
queue = deque([( [(init_i, init_j)], paper[init_i][init_j] )]) #path, val
while queue:
path, val = queue.popleft()
for i, j in path:
for di, dj in zip(dis, djs):
new_i, new_j = i+di, j+dj
if 0<=new_i<N and 0<=new_j<M and (new_i, new_j) not in path:
new_path, new_val = path+[(new_i, new_j)], val+paper[new_i][new_j]
if len(new_path) == 4:
maxval = max(maxval, new_val)
else:
queue.append((new_path, new_val))
return maxval
maxval = totalmax+3
for i in range(N):
for j in range(M):
if paper[i][j]*4 > maxval:
maxval = max(maxval, solution_BFS(i, j, N, M))
print(maxval)
์ฝ๋ ์ค๋ช
- ๋ชจ๋ ํฌ์ธํธ์ ๋ํด ๊ฒ์ฌํ์ง๋ ์๊ณ , ํ์ฌ ํฌ์ธํธ ๊ฐ * 4 > ํ์ฌ ์ต๋๊ฐ ์ธ ๊ฒฝ์ฐ์๋ง ๊ฒ์ฌ๋ฅผ ์งํ (์ด ๊ฒ์ฌ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํจ)
- ์ด๊ธฐ ์ต๋๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์ ๋ ฅ๋ฐ์ ๊ฐ๋ค์ ๋ํด ์ต๋๊ฐ์ ๊ตฌํ๊ณ , ๊ฑฐ๊ธฐ์ 3์ ๋ํ ๊ฐ์ ์ด๊ธฐ ์ต๋๊ฐ์ผ๋ก ์ค์ ํ๋ค. (๋ชจ๋ ๊ฐ์ด ์์ฐ์๋ผ๋ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก)
- BFS๋ฅผ ์ด์ฉํด ๋ชจ๋ ๋ชจํ์ ๊ตฌํจ.
- ํ์ฌ์์น์์ ์์ํด์, ์ํ์ข์ฐ ์ธ์ ํ ์ขํ๋ก ์ด๋ํ path๋ฅผ ๋์ ํด์ queue์ ์ ์ฅํ๋ค. ์ด ๋ path์ ์ํ๋ ๊ฐ๋ค์ ํฉ๋ ํจ๊ป ์ ์ฅํ๋ค (val)
- queue์์ pop์ ํด์ path๋ฅผ ์ป์ ํ, path์ ์ํ๋ ๋ชจ๋ ํฌ์ธํธ์ ๋ํด ์ํ์ข์ฐ ์ธ์ ํ ์ขํ๋ก ์ด๋์ ๋ฐ๋ณตํ๋ค. ์ด ๋, ์ด๋ํ ์ขํ๊ฐ ์ด๋ฏธ path์ ์์ผ๋ฉด ์ด๋ํ์ง ์๋๋ค.
- path์ ๊ธธ์ด๊ฐ 4๊ฐ ๋๋ฉด ๋์ด์ queue์ appendํ์ง ์๊ณ , maxval๊ณผ ๋น๊ตํด์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด T์๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํ์ง ์์๋ ๋จ.
๊ฒฐ๊ณผ
- Solution์ ์ฝ๋ - 384ms
- Solution์ ์ฝ๋๋ก ๋ชจ๋ point ๊ฒ์ฌ ์ - ์๊ฐ์ด๊ณผ
- Trial3์ ์ฝ๋๋ก ๋ชจ๋ point ๊ฒ์ฌ ์ - 2720ms
๋ค๋ฅธ ํ์ด
- ํ์ด1: DFS ์ด์ฉ (188ms)
- ๋ชจ๋ ํฌ์ธํธ์ ๋ํด ๊ฒ์ฌ. ๋จ, ๋งค depth๋ง๋ค, ๋จ์ depth*์ต๋๊ฐ์ ๋ํด๋ ํ์ฌ ์ต๋๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ํ์์ ์ค์งํจ์ผ๋ก์จ ํ์ ํ์๋ฅผ ์ค์ (์ด ๋ฐฉ์์ผ๋ก ํฌ์ธํธ๋ฅผ ๊ฑธ๋ฌ๋ด๋๊ฒ ์๊ฐ์ ๋ ์ค์ผ ์ ์๋ ๋ฏ ํ๋ค.)
- ํ ํฌ์ธํธ -> ์ธ์ ํฌ์ธํธ -> ์ธ์ ํฌ์ธํธ ์ด๋ ๊ฒ depth๊ฐ 4๊ฐ ๋ ๋๊น์ง ์งํ
- T๋ชจ์์ ๋ํด ๊ฒ์ฌํ๊ธฐ ์ํด, depth๊ฐ 2์ธ ๊ฒฝ์ฐ์๋ ์ด์ ์์น์์ ์ด์ด์ ์งํํ๋๋ก ํจ
- ์) (x, y) -> (x, y+1) -> (x, y+2) -> (x+1, y+1)
'๐ CS > ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 9084๋ฒ] ๋์ (python/ํ์ด์ฌ) + ์ค๋ฒ II ๋ฌ์ฑ (1) | 2022.10.08 |
---|---|
[๋ฐฑ์ค 2579๋ฒ] ๊ณ๋จ ์ค๋ฅด๊ธฐ (python/ํ์ด์ฌ) (0) | 2022.09.15 |
[๋ฐฑ์ค 7569๋ฒ] ํ ๋งํ (python/ํ์ด์ฌ) (0) | 2022.09.09 |
[๋ฐฑ์ค 16926๋ฒ] ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 1 (python/ํ์ด์ฌ) (0) | 2022.07.05 |
[๋ฐฑ์ค 2504๋ฒ] ๊ดํธ์ ๊ฐ (python/ํ์ด์ฌ) (0) | 2022.07.01 |