https://www.acmicpc.net/problem/14502
ํ์ด ๊ณผ์
ํ์ด๋ 3ํํธ๋ก ๋๋์ด์ ํ์๋ค.
1) ๋ฒฝ์ธ์ฐ๊ธฐ
2) ๋ฐ์ด๋ฌ์ค ๊ฐ์ผ
3) ์์ ์์ญ ๊ตฌํ๊ธฐ
์๋์ ์ผ๋ก ์๊ฐํ๊ธฐ ์ฌ์ด 2)๋ฐ์ด๋ฌ์ค ๊ฐ์ผ์ dfs๋ bfs๋ฅผ ์ฌ์ฉํ๊ณ
1)๋ฒฝ์ธ์ฐ๊ธฐ ํํธ๋ ์ ๋ ฅ๊ฐ์ N๊ณผ M์ด ์์ ๊ฒ์ ๋ณด๊ณ (์ต๋ 8) ๋ธ๋ฃจํธํฌ์ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ .
๋จผ์ ์ง๋์์ ๋น๊ณต๊ฐ๋ค์ ์ขํ๋ฅผ ๋ชจ์ ์ ์ฅํ๋ค.
๊ทธ ํ ํ์ด์ฌ์ combinations๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒฝ์ ์ธ์์ง๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ์ถํ๋ค.
๊ทธํ Deepcopy๋ฅผ ์ฌ์ฉํด 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ณต์ฌํด์ค๊ณ
๋น๊ณต๊ฐ 3๊ณณ์ ๋ฒฝ์ ์ธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ฐ์ด๋ฌ์ค ์์น์ ๋ํด infection(dfs)ํจ์๋ฅผ ์คํ
def infection(x, y):
if x <= -1 or x >= N or y <= -1 or y >= M:
return False
if B[x][y] == 1:
return False
if B[x][y] == 0 or B[x][y] == 2:
B[x][y] = 3 # ๋ฐ์ด๋ฌ์ค ๊ฐ์ผ 3
infection(x - 1, y)
infection(x + 1, y)
infection(x, y - 1)
infection(x, y + 1)
return True
return False
์ขํ์ ๊ฒฝ๊ณ๊ฐ์ด ๋์ด๊ฐ๊ฑฐ๋ ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ๋ return False์์ผ์ฃผ๊ณ ๋น๊ณต๊ฐ(0)์ด๊ฑฐ๋ ๋ฐ์ด๋ฌ์ค(2)๊ฐ ์๋๊ฒฝ์ฐ
์ซ์ 3์ ์ฌ์ฉํ์ฌ ๊ฐ์ผ์์ผฐ๋ค๋๊ฒ์ ํํํ์๋ค. ์ดํ ์ํ์ข์ฐ dfs๋ฐฉ๋ฒ์ผ๋ก ํ์
๋ง์ง๋ง์ผ๋ก ๋ฆฌ์คํธB์ ๋น๊ณต๊ฐ(0)์ ๊ฐ์๋ฅผ ์ธ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ๋ชจ์์ฃผ๋ ๋ฆฌ์คํธ(resultBox)์ ์ถ๊ฐ.
resultBox์์ ์ต๋๊ฐ์ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅํ๋ฉด ๋์ด๋ค.
ํ์ด์ฌ์ผ๋ก ์์ฑํ ์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import sys
import copy
from itertools import combinations
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
blank = [] # ๋น๊ณต๊ฐ ๋ฆฌ์คํธ
box = [] # ์ง๋
virus = [] # ๋ฐ์ด๋ฌ์ค ์์น ๋ฆฌ์คํธ
resultBox = []
# ์
๋ ฅ
N, M = map(int, input().split())
for i in range(N):
box.append([int(x) for x in input().split()])
for j in range(M):
if box[i][j] == 2: # ๋ฐ์ด๋ฌ์ค ์์น ์ ์ฅ
virus.append([i,j])
elif box[i][j] == 0: # ๋น๊ณต๊ฐ, ๋ฒฝ์ด ๋ค์ด ๊ฐ ์ ์๋ ์์น ์ ์ฅ
blank.append([i,j])
def infection(x, y):
if x <= -1 or x >= N or y <= -1 or y >= M:
return False
if B[x][y] == 1:
return False
if B[x][y] == 0 or B[x][y] == 2:
B[x][y] = 3 # ๋ฐ์ด๋ฌ์ค ๊ฐ์ผ 3
infection(x - 1, y)
infection(x + 1, y)
infection(x, y - 1)
infection(x, y + 1)
return True
return False
for a in combinations(blank, 3):
B = copy.deepcopy(box)
for s in a:
p = s[0]
q = s[1]
B[p][q] = 1 # ๋ฒฝ ์ธ์ฐ๊ธฐ
for v in virus:
infection(v[0], v[1])
result = 0
for i in range(N):
result += B[i].count(0)
resultBox.append(result)
print(max(resultBox))
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11718 ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ (python ํ์ด์ฌ) (0) | 2022.06.10 |
---|---|
[๋ฐฑ์ค] 1005 ACMCraft (python ํ์ด์ฌ) (0) | 2022.06.10 |
[๋ฐฑ์ค] 14499 ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ(python ํ์ด์ฌ) (0) | 2022.06.09 |
[๋ฐฑ์ค] 7576 ํ ๋งํ (python ํ์ด์ฌ) (0) | 2022.06.08 |
[๋ฐฑ์ค] 14503 ๋ก๋ด ์ฒญ์๊ธฐ (python ํ์ด์ฌ) (0) | 2022.05.23 |