-
[Python] ๋ฐฑ์ค(BOJ): 15683. ๊ฐ์์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 23. 18:43
๐๐ป ๋ฌธ์
๐คท๐ผโ๏ธ ๋ฌธ์ ์ค๋ช
์คํํธ๋งํฌ์ ์ฌ๋ฌด์ค์ 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)
- CCTV๋ ๊ฐ์ํ ์ ์๋ ๋ฐฉํฅ์ ์๋ ์นธ ์ ์ฒด๋ฅผ ๊ฐ์ํ ์ ์๋ค. ์ฌ๋ฌด์ค์๋ ๋ฒฝ์ด ์๋๋ฐ, CCTV๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๋ค.