โ๋ฌธ์
https://www.acmicpc.net/problem/14502
๋ฉ๋ชจ๋ฆฌ: 116952 KB, ์๊ฐ: 1284 ms
๊ตฌํ, ๊ทธ๋ํ ์ด๋ก , ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ, ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์, ๊ฒฉ์ ๊ทธ๋ํ
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค.
์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ N×M์ธ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ง์ฌ๊ฐํ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค.
์ผ๋ถ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ๋ชจ๋ ํผ์ ธ๋๊ฐ ์ ์๋ค. ์๋ก ์ธ์ธ ์ ์๋ ๋ฒฝ์ ๊ฐ์๋ 3๊ฐ์ด๋ฉฐ, ๊ผญ 3๊ฐ๋ฅผ ์ธ์์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฐ๊ตฌ์๊ฐ ์๊ธด ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
์ด๋, 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ์ด๋ค. ์๋ฌด๋ฐ ๋ฒฝ์ ์ธ์ฐ์ง ์๋๋ค๋ฉด, ๋ฐ์ด๋ฌ์ค๋ ๋ชจ๋ ๋น ์นธ์ผ๋ก ํผ์ ธ๋๊ฐ ์ ์๋ค.
2ํ 1์ด, 1ํ 2์ด, 4ํ 6์ด์ ๋ฒฝ์ ์ธ์ด๋ค๋ฉด ์ง๋์ ๋ชจ์์ ์๋์ ๊ฐ์์ง๊ฒ ๋๋ค.
2 1 0 0 1 1 0
1 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 1 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๋ค์ ๋ชจ์ต์ ์๋์ ๊ฐ์์ง๋ค.
2 1 0 0 1 1 2
1 0 1 0 1 2 2
0 1 1 0 1 2 2
0 1 0 0 0 1 2
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
๋ฒฝ์ 3๊ฐ ์ธ์ด ๋ค, ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์๋ ๊ณณ์ ์์ ์์ญ์ด๋ผ๊ณ ํ๋ค. ์์ ์ง๋์์ ์์ ์์ญ์ ํฌ๊ธฐ๋ 27์ด๋ค.
์ฐ๊ตฌ์์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋ ์ป์ ์ ์๋ ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โ๐ปํ์ด
์ฐ์ ๋ฐฑํธ๋ํน์ ์ด์ฉํด ๋ฒฝ์ ์ธ์ธ ๋น ์นธ์ ์ฐพ๋๋ค.
๋ฒฝ์ ์ธ ๊ณณ์ ์ธ์ฐ๊ณ ๋๋ฉด ๋ฐ์ด๋ฌ์ค์ ์์น๋ฅผ ์ฐพ์์ BFS๋ก ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ๋ฒ์๋ฅผ ํ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒฝ๊ณผ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๊ณณ์ ์ ์ธํ๊ณ ๊ณ์ฐํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์ฐํ ๊ฐ ์ค ๊ฐ์ฅ ๋์ ์์ ์ง๋ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ป์ฝ๋
๋ด ํ์ด
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split()) # N = ์ธ๋ก, M = ๊ฐ๋ก
labs = [list(map(int, input().split())) for _ in range(N)]
def bfs():
q = deque()
visited = [[1 if labs[y][x] == 1 else 0 for x in range(M)] for y in range(N)] # ๋ฒฝ์ 1๋ก ํ์.
for y in range(N):
for x in range(M):
if labs[y][x] == 2:
q.append((y, x))
visited[y][x] = 1 # ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น์ 1 ํ์
while q:
y, x = q.popleft()
for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)): # ์ํ์ข์ฐ
ny, nx = y + dy, x + dx
if 0 <= ny < N and 0 <= nx < M:
if visited[ny][nx] == 0 and labs[ny][nx] == 0:
visited[ny][nx] = 1 # ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ก์ผ๋ฏ๋ก 1 ํ์
q.append((ny, nx))
res = 0
for i in range(N):
res += visited[i].count(0) # ๋ฒฝ๊ณผ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๊ณณ์ ์ ์ธํ๊ณ ์์ ์ง๋ ๊ฐ์ ์ธ๊ธฐ
return res
def backtraking(w):
global ans
if w == 3: # ๋ฒฝ์ ์ธ ๊ฐ ์ธ์ด ํ ์์ ์ง๋ ๋์ด ํ์ธ
ans = max(bfs(), ans)
return
for y in range(N):
for x in range(M):
if labs[y][x] == 0:
labs[y][x] = 1
backtraking(w + 1)
labs[y][x] = 0
ans = 0
backtraking(0)
print(ans)
๋ค๋ฅธ ํ์ด
https://www.youtube.com/watch?v=1Ab5s8HV1ww ์ฐธ๊ณ
import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split()) # N = ์ธ๋ก, M = ๊ฐ๋ก
labs = [list(map(int, input().split())) for _ in range(N)]
def bfs(walls):
# ์ ํํ ์์น์ ๋ฒฝ ์ธ์ฐ๊ธฐ
for y, x in walls:
labs[y][x] = 1
q = deque(virus)
res = CNT - 3 # ๋ฒฝ ์ธ์ด ๊ฐ์๋ฅผ ๋นผ๊ณ ๋จ์ ๋น ์นธ
visit = [[1 if (y, x) in virus else 0 for x in range(M)] for y in range(N)]
while q:
y, x = q.popleft()
for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)):
ny, nx = y + dy, x + dx
if 0 <= ny < N and 0 <= nx < M and visit[ny][nx] == 0 and labs[ny][nx] == 0:
q.append((ny, nx))
visit[ny][nx] = 1
res -= 1
for y, x in walls:
labs[y][x] = 0
return res
ans = 0
empty = []
virus = []
# ๋น์ด์๋ ๊ณณ๊ณผ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ ํ์
for y in range(N):
for x in range(M):
if labs[y][x] == 0:
empty.append((y, x))
elif labs[y][x] == 2:
virus.append((y, x))
# ๋น์ด์๋ ๊ณณ ์ค ํ ๊ณณ์ ๋ฒฝ์ ์ธ์ธ ์ธ ๊ณณ ์ ํ
CNT = len(empty)
for i in range(CNT-2):
for j in range(i+1, CNT-1):
for k in range(j+1, CNT):
ans = max(bfs([empty[i], empty[j], empty[k]]), ans)
print(ans)
๐ํ๊ธฐ
์ฒ์ ํ์์ ๋ Backtracking๊ณผ BFS๋ก ํ๋๋ฐ ์๊ฐ์ด ๋๋ฌด ์ฒ์ฐธํด์ ๋ค๋ฅธ ํ์ด๋ฅผ ์ฐพ์๋ณด์๋ค. ์๊ฐ์ด 4๋ฐฐ ์ด์ ์ฐจ์ด๋๋ ๊ฑธ ๋ณด๋ ์ง์ง ์๊ณ ๋ฆฌ์ฆ์ด ์ค์ํ๋ค๋ ์ ์ ์์ผ ๋ค์ ํ ๋ฒ ์ฒด๊ฐํ๋ค..
๊ทธ๋ฆฌ๊ณ ์ฒ์ ํ์๋ ์๊ณ ๋ฆฌ์ฆ์์ ๋ค์ ์์ ํด์ ๊ทธ ์ ๋ณด๋ค๋ ์ค์์ง๋ง ๊ทธ๋๋ ์ฒ์ฐธํ๋ค. ์ฒ์ ํ์ด์๋ deepcopy๋ก ๊น์ ๋ณต์ฌ๋ฅผ ํ๋๋ฐ ์๋ง ์ด๊ฒ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ด์ง ์์๊น ์ถ๋ค.
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11404. ํ๋ก์ด๋/Python - Gold4 (0) | 2025.08.07 |
---|---|
[๋ฐฑ์ค] 14500. ํ ํธ๋ก๋ฏธ๋ ธ/Python - Gold4 (2) | 2025.08.06 |
[๋ฐฑ์ค] 14499. ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ/Python - Gold4 (4) | 2025.08.02 |
[๋ฐฑ์ค] 3190. ๋ฑ/Python - Gold4 (3) | 2025.07.30 |
[๋ฐฑ์ค] 14503. ๋ก๋ด ์ฒญ์๊ธฐ/Python - Gold5 (1) | 2025.07.29 |