
๋ฐฑ์ค 15686 ์นํจ ๋ฐฐ๋ฌ - ์กฐํฉ ์์ ํ์
๋ฌธ์ ํต์ฌ
- N×N ๊ฒฉ์์ ์ง(1), ์นํจ์ง(2) ์์
- ์นํจ ๊ฑฐ๋ฆฌ: ๊ฐ ์ง์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊น์ง์ ๋งจํดํผ ๊ฑฐ๋ฆฌ
- ๋์ ์นํจ ๊ฑฐ๋ฆฌ: ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ ํฉ
- ์นํจ์ง ์ค M๊ฐ๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง ํ์
- ๋ชฉํ: ๋์ ์นํจ ๊ฑฐ๋ฆฌ ์ต์ํ
๊ฐ๋ ์ ๋ฆฌ
์๋ชป๋ ์ ๊ทผ๋ฒ
"๊ฑฐ๋ฆฌ ๋ฉ์ด์ ์นํจ์ง ๋จผ์ ์ ๊ฑฐํ๋ฉด ๋จ" → ์๋. ๋ฉ์ด๋ ํน์ ์ง์๊ฒ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง์ผ ์ ์์
"์นํจ์ง ๊ธฐ์ค์ผ๋ก ๊ฐ๊น์ด ์ง ์ฐพ๊ธฐ" → ์๋. ์ง ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฐพ๋ ๋ฌธ์ ์
์ฌ๋ฐ๋ฅธ ์ ๊ทผ
์กฐํฉ + ์์ ํ์
- ์นํจ์ง ์ต๋ 13๊ฐ → 13CM ๊ฒฝ์ฐ์ ์ ๋งค์ฐ ์ ์
- ๋ชจ๋ M๊ฐ ์กฐํฉ ๋ค ํด๋ณด๋ฉด ๋จ
๊ตฌํ
1. ๋งจํดํผ ๊ฑฐ๋ฆฌ
distance = abs(x1 - x2) + abs(y1 - y2)
BFS/DFS ๊ฐ์ ๊ฑฐ ์ธ ํ์ ์์. ๊ทธ๋ฅ ์ขํ ์ฐจ์ด ๊ณ์ฐํ๋ฉด ๋.
2. ์กฐํฉ ์์ฑ
์ค์ ์ฉ - itertools
from itertools import combinations
possible_combinations = combinations(chickens, m)
๊ฐ๋ ์ดํด์ฉ - ๋ฐฑํธ๋ํน
def make_combinations(chickens, m_count):
result = []
selected = []
def dfs(depth, start_idx):
if depth == m_count:
result.append(selected[:])
return
for i in range(start_idx, len(chickens)):
selected.append(chickens[i])
dfs(depth + 1, i + 1)
selected.pop() # ๋ฐฑํธ๋ํน
dfs(0, 0)
return result
3. ๊ฑฐ๋ฆฌ ๊ณ์ฐ
def cal_route(houses, selected_chickens):
total = 0
for hx, hy in houses:
min_dist = float('inf')
for cx, cy in selected_chickens:
dist = abs(hx - cx) + abs(hy - cy)
min_dist = min(min_dist, dist)
total += min_dist
return total
์ ์ฒด ์ฝ๋
import sys
from itertools import combinations
input = sys.stdin.readline
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
houses = []
chickens = []
for r in range(n):
for c in range(n):
if board[r][c] == 1:
houses.append((r, c))
elif board[r][c] == 2:
chickens.append((r, c))
def cal_route(houses, selected_chickens):
total = 0
for hx, hy in houses:
min_dist = float('inf')
for cx, cy in selected_chickens:
dist = abs(hx - cx) + abs(hy - cy)
min_dist = min(min_dist, dist)
total += min_dist
return total
min_distance = float('inf')
for combo in combinations(chickens, m):
distance = cal_route(houses, combo)
min_distance = min(min_distance, distance)
print(min_distance)
ํต์ฌ ์์ฝ
- ์ขํ ์ ์ฅ: ์ง, ์นํจ์ง ์์น ๊ธฐ๋ก
- ์กฐํฉ ์์ฑ: M๊ฐ ์นํจ์ง ์ ํํ๋ ๋ชจ๋ ๊ฒฝ์ฐ
- ๊ฑฐ๋ฆฌ ๊ณ์ฐ: ๊ฐ ์ง์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊น์ง ๊ฑฐ๋ฆฌ
- ์ต์๊ฐ: ๋ชจ๋ ์กฐํฉ ์ค ์ต์ ๋์ ์นํจ ๊ฑฐ๋ฆฌ
์นํจ์ง ์ต๋ 13๊ฐ๋ผ์ ์์ ํ์ ๊ฐ๋ฅ. ๋ณต์กํ๊ฒ ์๊ฐํ์ง ๋ง๊ณ ๊ทธ๋ฅ ๋ค ํด๋ณด๋ฉด ๋จ.
๋ฐ์ํ
'๐ Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| โ BOJ 1504 - ๋ค์ต์คํธ๋ผ ์์ฉ (0) | 2025.07.04 |
|---|---|
| โ BOJ 17070 - 3์ฐจ์ DP (0) | 2025.07.03 |
| โ BOJ 1043 - ์ ๋์จ ํ์ธ๋ (0) | 2025.07.02 |
| โ BOJ 1918 - ์คํ (0) | 2025.07.01 |
| [์ฝํ ] 2206 - ํผ๋ณด๋์น ํ๋ ฌ์ฐ์ฐ (0) | 2025.06.28 |