[Python] ๋ฐฑ์ค(BOJ): 15683. ๊ฐ์
๐๐ป ๋ฌธ์
15683๋ฒ: ๊ฐ์
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ
www.acmicpc.net
๐คท๐ผโ๏ธ ๋ฌธ์ ์ค๋ช
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ N×M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
์ฌ๋ฌด์ค์๋ ์ด K๊ฐ์ CCTV๊ฐ ์ค์น๋์ด์ ธ ์๋๋ฐ, CCTV๋ 5๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค. ๊ฐ CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
1๋ฒ CCTV๋ ํ ์ชฝ ๋ฐฉํฅ๋ง ๊ฐ์ํ ์ ์๋ค. 2๋ฒ๊ณผ 3๋ฒ์ ๋ ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋๋ฐ, 2๋ฒ์ ๊ฐ์ํ๋ ๋ฐฉํฅ์ด ์๋ก ๋ฐ๋๋ฐฉํฅ์ด์ด์ผ ํ๊ณ , 3๋ฒ์ ์ง๊ฐ ๋ฐฉํฅ์ด์ด์ผ ํ๋ค. 4๋ฒ์ ์ธ ๋ฐฉํฅ, 5๋ฒ์ ๋ค ๋ฐฉํฅ์ ๊ฐ์ํ ์ ์๋ค.
- CCTV๋ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์๋ ์นธ ์ ์ฒด๋ฅผ ๊ฐ์ํ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ๋ฒฝ์ด ์๋๋ฐ, CCTV๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.
CCTV๊ฐ ๊ฐ์ํ ์ ์๋ ์์ญ์ ์ฌ๊ฐ์ง๋๋ผ๊ณ ํ๋ค. - CCTV๋ ํ์ ์ํฌ ์ ์๋๋ฐ, ํ์ ์ ํญ์ 90๋ ๋ฐฉํฅ์ผ๋ก ํด์ผ ํ๋ฉฐ, ๊ฐ์ํ๋ ค๊ณ ํ๋ ๋ฐฉํฅ์ด ๊ฐ๋ก ๋๋ ์ธ๋ก ๋ฐฉํฅ์ด์ด์ผ ํ๋ค.
์ฌ๋ฌด์ค์ ํฌ๊ธฐ์ ์ํ, ๊ทธ๋ฆฌ๊ณ CCTV์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, CCTV์ ๋ฐฉํฅ์ ์ ์ ํ ์ ํด์, ์ฌ๊ฐ ์ง๋์ ์ต์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โ๏ธ ํ์ด
DFS + ๊ตฌํ ๋ฌธ์ ๋ค.
๊ฐ๊ฐ์ CCTV๊ฐ ํ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ๋ํ ๊ฒฝ์ฐ์ ์๋ง ์ ์ ๋ฆฌํด๋ด๋ฉด ๋๋ค.
์
๋ ฅ๊ฐ์ ๋ฒ์๊ฐ 1 ≤ N, M ≤ 8๋ก ๋งค์ฐ ์๊ธฐ ๋๋ฌธ์, ๋ธ๋ฃจํธ ํฌ์ค๋ก ๊ตฌํํ ์ ์์ด๋ณด์ธ๋ค.
๊ฐ๊ฐ์ CCTV์ ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ชจ๋ ์ฌ๊ฐ์ง๋๋ฅผ ํ์ํ๊ณ , ๊ทธ ์ค ์ต์๊ฐ์ ๊ตฌํด๋ด๋ฉด ๋๋ค.
๊ตฌํ๋ฌธ์ ์น๊ณ ์ง๋ฌธ์ด ์์ฃผ ์น์ ํ๋ ๊ฒ ๊ฐ์์, ๊ฐ์ธ์ ์ผ๋ก ๊ณจ๋4 ๋์ด๋๊น์ง๋ ์๋์๋ ๊ฒ ๊ฐ๋ค.
์ญ์ ๊ตฌํ์ ์กฐ๊ธ ๋์๊ฐ๋ ๊ฒ ๊ฐ์ ๋ถ์ํ๋๋ผ๋ ์ฝ๋๋ฅผ ์ง๊ธฐ ์ ์ ์ค๊ณ๋ฅผ ๊ผผ๊ผผํ๊ฒ ํด์ผ ๋๋ค๋ ๊ฒ์ ๋ค์ ๋๊ผ๋ค.
import sys
from itertools import product
from copy import deepcopy
# ๊ฐ๊ฐ์ cctv ๋ฒํธ๋ฅผ key๋ก,
# ํ์ ์ ๋ฐ๋ฅธ ๊ฐ์ ๊ฐ๋ฅํ ๋ฐฉํฅ์ ๊ฒฝ์ฐ์ ์์ list๋ฅผ value๋ก ํ๋ ๋์
๋๋ฆฌ๋ก ์ ์
cctv = {
1: [['right'], ['left'], ['up'], ['down']],
2: [['right', 'left'], ['up', 'down']],
3: [
['up', 'right'],
['right', 'down'],
['down', 'left'],
['left', 'up']]
,
4: [['left', 'up', 'right'], ['up', 'right', 'down'], ['right', 'down', 'left'], ['down', 'left', 'up']],
5: [['left', 'right', 'up', 'down']]
}
def dfs(x, y, key, v_idx):
global N, M, d_arr
# cctv ๋ฒํธ, ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์ค์
direction = cctv[key][v_idx]
# ๊ฐ์ํ ์ ์๋ ์์ญ์ ํ์
for d in direction:
if d == 'up':
loc = x
while loc - 1 >= 0:
if d_arr[loc - 1][y] == 6:
break
if d_arr[loc - 1][y] == 0:
d_arr[loc - 1][y] = '#'
loc -= 1
elif d == 'right':
loc = y
while loc + 1 < M:
if d_arr[x][loc + 1] == 6:
break
if d_arr[x][loc + 1] == 0:
d_arr[x][loc + 1] = '#'
loc += 1
elif d == 'left':
loc = y
while loc - 1 >= 0:
if d_arr[x][loc - 1] == 6:
break
if d_arr[x][loc - 1] == 0:
d_arr[x][loc - 1] = '#'
loc -= 1
elif d == 'down':
loc = x
while loc + 1 < N:
if d_arr[loc + 1][y] == 6:
break
if d_arr[loc + 1][y] == 0:
d_arr[loc + 1][y] = '#'
loc += 1
def count_blind_spot():
global N, M, d_arr
result = 0
for x in range(N):
for y in range(M):
if d_arr[x][y] == 0:
result += 1
return result
N, M = map(int, sys.stdin.readline().split())
arr = []
cctv_list = []
for i in range(N):
temp = list(map(int, sys.stdin.readline().split()))
arr.append(temp)
for j in range(M):
if 1 <= temp[j] <= 5:
cctv_list.append((i, j))
# cctv์ ์ข
๋ฅ, ํ์ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
total_cctv_list = list(product(*[[t for t in range(len(cctv[arr[i][j]]))] for i, j in cctv_list]))
answer = float('inf')
for data in total_cctv_list:
d_arr = deepcopy(arr)
# ๊ฐ์์์ญ์ ๊ฐฑ์
for i, cctv_dir in enumerate(data):
loc_i, loc_j = cctv_list[i]
cctv_key = arr[loc_i][loc_j]
dfs(loc_i, loc_j, cctv_key, cctv_dir)
d_answer = count_blind_spot()
# ์ฌ๊ฐ์ง๋(d_answer)์ ์ต์ ํฌ๊ธฐ ๊ฐฑ์
answer = min(d_answer, answer)
print(answer)