๋ฌธ์ ๋งํฌ
14502๋ฒ: ์ฐ๊ตฌ์
๋ฌธ์ ์์ฝ
์ฐ๊ตฌ์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋ฐ์ด๋ฌ์ค๋ ๋ฒฝ์ ๋ซ์ง ๋ชปํ๋ฉฐ ๊ฐ๋ก ๋๋ ์ธ๋ก ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ๋ฒฝ์ 3๊ฐ ์ธ์ธ ๋, ํ๋ณดํ ์ ์๋ ์์ ๊ณต๊ฐ์ ์ต๋ ๊ฐฏ์๋ฅผ ๊ตฌํ๊ณ ์ถ๋ค. ์ด ๋ ์์ ๊ณต๊ฐ์ ๋ฒฝ์ผ๋ก ๋งํ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ค์ง ๋ชปํ๋ ๊ณต๊ฐ์ด๋ค.
์ ๋ ฅ์ผ๋ก N×M ํฌ๊ธฐ์ ์ฐ๊ตฌ์๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น๊ณต๊ฐ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ์๋ฏธํ๋ค.
ํ์ด ๊ณผ์
์์์ ์ ์ถ๋ ฅ์์ ์์ ๊ณต๊ฐ์ ์ต๋๋ก ํ๋ณดํ ์ ์๋ ์ต์ ์ ๋ฒฝ ์์น๋ฅผ ์ปดํจํฐ๊ฐ ์ด๋ป๊ฒ ์ ์ ์์๊น ์๊ฐํด๋ณธ ํ,
1) ๋ชจ๋ ๋ฒฝ์ ์ธ์ฐ๋ ๊ฒฝ์ฐ์ ๋ํด์
2) ์์ ๊ณต๊ฐ์ ๋์ด๋ฅผ ๊ณ์ฐํ๊ณ ์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
๋ผ๋ ์ ๊ทผ์ผ๋ก ํ ์๋ฐ์ ์๋ค๊ณ ์๊ฐ์ด ๋ค์๋ค.
์ฒซ ๋ฒ์งธ ์๋: for๋ฌธ์ผ๋ก ์กฐ๊ฑด์ ๋ง๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ ํ์
์ฐ์ , ์ ์ฒด ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
from copy import deepcopy
from collections import deque
N, M=map(int, input().split())
virus_map=[]
for _ in range(N):
virus_map.append(list(map(int, input().split())))
def safety_zone(virus_map):
dx=[1, -1, 0, 0]
dy=[0, 0, 1, -1]
visited=[[0 for _ in range(M)] for _ in range(N)]
for i in range(N):
for j in range(M):
if virus_map[i][j]==2 and visited[i][j]==0:
q=deque([(i, j)])
while q:
x, y=q.popleft()
visited[x][y]=1
for k in range(4):
cx, cy=x+dx[k], y+dy[k]
if 0<=cx<N and 0<=cy<M:
if visited[cx][cy]==0:
if virus_map[cx][cy]==0:
virus_map[cx][cy]=2
q.append((cx, cy))
elif virus_map[cx][cy]==1:
continue
elif virus_map[cx][cy]==2:
q.append((cx, cy))
safety_zone_size=0
for i in range(N):
for j in range(M):
if virus_map[i][j]==0:
safety_zone_size+=1
return safety_zone_size
max_safety_zone=0
for i in range(N*M-2):
x1, y1=i//M, i%M
if virus_map[x1][y1]>0:
continue
for j in range(i+1, N*M-1):
x2, y2=j//M, j%M
if virus_map[x2][y2]>0:
continue
for k in range(j+1, N*M):
x3, y3=k//M, k%M
if virus_map[x3][y3]>0:
continue
virus_map_arg=deepcopy(virus_map)
virus_map_arg[x1][y1]=1
virus_map_arg[x2][y2]=1
virus_map_arg[x3][y3]=1
max_safety_zone=max(max_safety_zone, safety_zone(virus_map_arg))
print(max_safety_zone)
์ ์ฝ๋๋ฅผ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ๋ณด๋ฉด, main๋ถ๋ ์๋์ ๊ฐ๋ค.
๊ฐ๋ฅํ ๋ฒฝ์ ์ธ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋, ์ผ์ค for๋ฌธ์ ๋๋ฉด์ ์ธ ์ขํ์์ virus_map์ ๊ฐ์ด ๋ชจ๋ 0์ผ ๋ max_safety_zone์ ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ์์ผ๋ก ํ์ํ์๋ค.
max_safety_zone=0
for i in range(N*M-2):
x1, y1=i//M, i%M
if virus_map[x1][y1]>0:
continue
for j in range(i+1, N*M-1):
x2, y2=j//M, j%M
if virus_map[x2][y2]>0:
continue
for k in range(j+1, N*M):
x3, y3=k//M, k%M
if virus_map[x3][y3]>0:
continue
virus_map_arg=deepcopy(virus_map)
virus_map_arg[x1][y1]=1
virus_map_arg[x2][y2]=1
virus_map_arg[x3][y3]=1
max_safety_zone=max(max_safety_zone, safety_zone(virus_map_arg))
๊ฐ ์ขํ์ virus_map ๊ฐ์ด 0์ธ์ง ํ์ธํ๊ณ , ์กฐ๊ฑด์ ๋ง๋ ์ธ ๋ฒฝ์ ์ขํ๋ฅผ ์ฐพ์ผ๋ฉด ํด๋น ์์น์ ๋ฒฝ์ด ์ธ์์ก์ ๋ ์์ ๊ตฌ์ญ์ ๋์ด๋ฅผ ๊ตฌํ๋ safety_zone์ ์คํํ์ฌ max_safety_zone์ ์ ๋ฐ์ดํธํ๋ค.
safety_zone์ bfs ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ผ๋ก virus[i][j]==2์ผ ๋, ํด๋น ์ขํ๋ฅผ queue์ ๋ฃ๊ณ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ํ์ map์ ๊ตฌํ๋ค. ์ด ๋, visited matrix๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณตํ์ฌ, ๋ฌดํ ํ์๋์ง ์๋๋ก ์ฒ๋ฆฌํ๊ณ ์ ํ์๋ค.
(์ด๋ ์ด๊ธฐ ์๋๋ก์จ ํนํ virus_map[cx][cy]==2: q.append(cx, cy)๋ ๋ถํ์ํ ์ฝ๋์ด๋ค.)
def safety_zone(virus_map):
dx=[1, -1, 0, 0]
dy=[0, 0, 1, -1]
visited=[[0 for _ in range(M)] for _ in range(N)]
for i in range(N):
for j in range(M):
if virus_map[i][j]==2 and visited[i][j]==0:
q=deque([(i, j)])
while q:
x, y=q.popleft()
visited[x][y]=1
for k in range(4):
cx, cy=x+dx[k], y+dy[k]
if 0<=cx<N and 0<=cy<M:
if visited[cx][cy]==0:
if virus_map[cx][cy]==0:
virus_map[cx][cy]=2
q.append((cx, cy))
elif virus_map[cx][cy]==1:
continue
elif virus_map[cx][cy]==2:
q.append((cx, cy))
safety_zone_size=0
for i in range(N):
for j in range(M):
if virus_map[i][j]==0:
safety_zone_size+=1
return safety_zone_size
๋ ๋ฒ์งธ ์๋: bfs ํ์ ์ค ์ค๋จ ์กฐ๊ฑด ๋ง๋ค๊ธฐ
์ฅ๋ ฌํ๊ฒ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ง๊ณ , ์์ ์๊ฐ์ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ์๋ค.
bfs ํ์ ์ค, max_safety๊ฐ ๋ ์ ์๋ ์ํฉ์ผ ๋ ํ์์ ์ค๋จํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ณด์๋ ์์ด๋์ด๋ก, safety_zone์ ๊ตฌํ๋ ๊ฒ๊ณผ ๋ฐ๋๋ก min_danger_zone์ ์ ๋ฐ์ดํธํ๊ณ , ๋ง์ง๋ง์ ์๋ณธ virus_map์ safety_zone ์ฌ์ด์ฆ์ (dager_zone ์ฌ์ด์ฆ+๋ฒฝ์ ๊ฐฏ์์ธ 3)์ ๋นผ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
(์ฒ์์ ๋ฒฝ ๊ฐ์ ๋นผ์ฃผ๋ ๊ฒ์ ์๊ฐ ๋ชปํด์ ๋ต์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ ๋นํฉํ๋ค. ์์ ์ ์ถ๋ ฅ ์ ๋ต์ ๋ฒฝ ์์น ์กฐ๊ฑด์ผ ๋, ๋ฐ์ด๋ฌ์ค ์ ํ ํ virus_map์ ์ถ๋ ฅํ๊ณ ์ด๋ฅผ danger_zone_size ๋ฑ๊ณผ ๋น๊ตํ๋ฉด์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค.)
min_danger_zone=min(min_danger_zone, danger_zone(virus_map_arg, min_danger_zone))
์๋๋ danger_zone์ ๊ตฌํ๋ ํจ์์ ์ฝ๋์ด๋ค. 0=>2๋ก ๋ณ๊ฒฝํ ๊ฒฝ์ฐ์ danger_zone์ 1์ฉ ๋ํ๋ค.
if danger_zone_size>min_danger_zone์ด๋ฉด, ๋์ด์์ ํ์์ด ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณง๋ฐ๋ก return ํ๋ค.
def danger_zone(virus_map, min_danger_zone):
dx=[1, -1, 0, 0]
dy=[0, 0, 1, -1]
visited=[[0 for _ in range(M)] for _ in range(N)]
danger_zone_size=0
for i in range(N):
for j in range(M):
if virus_map[i][j]==2 and visited[i][j]==0:
q=deque([(i, j)])
while q:
x, y=q.popleft()
visited[x][y]=1
for k in range(4):
cx, cy=x+dx[k], y+dy[k]
if 0<=cx<N and 0<=cy<M:
if visited[cx][cy]==0:
if virus_map[cx][cy]==0:
virus_map[cx][cy]=2
q.append((cx, cy))
danger_zone_size+=1
if danger_zone_size>min_danger_zone:
return danger_zone_size
elif virus_map[cx][cy]==1:
continue
elif virus_map[cx][cy]==2:
q.append((cx, cy))
return danger_zone_size
์ด ์ฝ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋ด๋ค.
๋ค์ ์ฐฌ์ฐฌํ ์ ์ถ๋ ฅ์ ์ดํด๋ณด๋, ์๋์ ์์ ๋ ๋ฐ๊พผ ์ฝ๋์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋นํจ์จ์ ์ผ๋ก ๋์๊ฐ๊ฒ ๋ค ์๊ฐ๋์๋ค. ์ค์ ๋ก local์์ ์คํํด๋ด๋ ๊ฝค ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์ ์ถ๋ ฅ ์์์๋ค.
์ธ ๋ฒ์งธ ์๋: ์ผ์ค for๋ฌธ→ ๋จ์ผ for๋ฌธ ์ํ, visited matrix ๋ฐ ํ๋จ ์กฐ๊ฑด๋ฌธ ์ ๊ฑฐ
์์ด๋์ด๊ฐ ๋ ์ค๋ฅด์ง ์์ ๋ค๋ฅธ ๋ต ์ฝ๋๋ฅผ ์ฐพ์๋ณด์๋ค.
์๋์ ํฌ์คํ ์์ ๋ง์ ๋์์ ์ป์๋๋ฐ, ์ฝ๋์ ๊ตฌ์ฑ ์์ฒด๋ ๋์ผํ์ง๋ง ๋ค์ ์ต์ ํ ๋ฐฉ๋ฒ์ ์ฐจ์ฉํจ์ผ๋ก์จ ์๊ฐ ์ด๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
[BFS/Combination] ๋ฐฑ์ค#14502: ์ฐ๊ตฌ์/Python ํ์ด
๐ ๋ฌธ์ https://www.acmicpc.net/problem/14502 14502๋ฒ: ์ฐ๊ตฌ์ ์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง
heytech.tistory.com
์ฒซ ๋ฒ์งธ๋ก, ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒฝ๋ค์ ์ขํ ์์น๋ ์๋ณธ virus_map์์ value๊ฐ 0์ธ ์ขํ๋ค ์ค 3๊ฐ๋ฅผ ์ ํํ๋ ์กฐํฉ๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. ๊ธฐ์กด์๋ ์ด๋ฅผ ์ผ์ค for๋ฌธ์ผ๋ก ์ํํ๋ฉด์ ํ์ํ์์ผ๋, ์ ํฌ์คํ ์์ ์๊ฐ๋ itertools์ combinations๋ฅผ ์ฌ์ฉํ์๋ค. combinations ๋ฉ์๋๊ฐ ํน๋ณํ ์๊ฐ ๋ณต์ก๋๊ฐ ๋ฎ์ ๊ฒ์ ์๋๋ฐ ๊ฒฝํ ์ ์ฌ๊ท ํจ์๋, ๋ค์ค for๋ฌธ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ์์น ์ด๋(?) ๋น๋ฒํ ์ฝ๋๊ฐ ์์ ์๊ฐ์ด ๋๋ต์ ์ผ๋ก ์์ธกํ ์๊ฐ๋ณด๋ค ๊ธธ๊ฒ ๊ฑธ๋ฆฌ๋ ๊ฒ ๊ฐ์์ ์์ ์๊ฐ ์ต์ ํ์ ๋์์ ์ฃผ์ง ์์๋ ์ถ์ธกํ๋ค.
๋ ๋ฒ์งธ๋ก, ์ด๊ธฐ queue์ ๋ชจ๋ virus์ ์์น ์ขํ๋ฅผ ๋ฃ์ด์ ์ดํ์ virus_map[i][j]==2์ผ ๋, ๋ฐ๋ก visited๋ฅผ ํ์ธํ๊ฑฐ๋ queue.append()ํ๋ ์ ์ฐจ๋ฅผ ์๋ตํ์๋ค. ์ด ๋, ์์ ์ฐธ๊ณ ์ฝ๋์์ ๋ง์์ ๋ค์๋ ๋ถ๋ถ์ด ์๋์ ๊ฐ์ด list comprehension์ผ๋ก ์ด๊ธฐ queue๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์ธํ๋ค๋ ์ ์ด์๋ค.
q=[(i, j) for i in range(N) for j in range(M) if virus_map[i][j]==2]
์ด ๋ ๊ฐ์ง ๋ถ๋ถ์ ์์ ํ ๋ค, local์์ ์คํํ์ ๋์ ํจ์ฌ ์ฝ๋์ ์คํ ์๋๊ฐ ๋นจ๋ผ์ง์ ๋๋ ์ ์์๊ณ , ๋ฐฑ์ค ์ฑ์ ๋ ํต๊ณผํ์๋ค.
bfs ๊ด๋ จ ๋ฌธ์ ๋ค์ ํ๋ฉด์ ํ ๊ฐ์ง ๋๋ผ๋ ์ ์, ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ๋ฅผ ๊ทธ๋๋ก ์ฐ๊ธฐ๋ณด๋ค๋ ๊ฐ ๋ฌธ์ ์ ๋ฐ๋ผ ์ต์ ํ ๊ฐ๋ฅํ ๋ถ๋ถ์ ์ต์ ํ๋ฅผ ํ๋ฉด์ ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ฒ ์ฝ๋๋ฅผ ์ฐ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ, ์ต์ ํ์ ๋๋ฌด ์ ๊ฒฝ์ ์ฐ๋ค๋ณด๋ฉด ์ค์๊ฐ ๋ง์์ง๊ณ , ์ํ๋ return ๊ฐ์ด ์ ๋์ฌ ๋ ์์ ํด์ผํ๋ ๋ถ๋ถ์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์์ ธ ์ ๋นํ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.
์๊ณ ๋ฆฌ์ฆ์ ์ ๋นํ ํ์ฉํ๋ ๊ฒ์ ๊ฒฐ๊ตญ ์์ ๊ฒฝํ์ด ๋ง์์ ธ์ผ ๋ ์ฌ์์ง์ง ์์๊นํ๊ณ ์๊ฐํ๋ค.