๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch12-13] ์นํจ ๋ฐฐ๋ฌ (๊ตฌํ)
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
์นํจ๊ฑฐ๋ฆฌ : ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ
๋์์ ์นํจ๊ฑฐ๋ฆฌ : ์นํจ๊ฑฐ๋ฆฌ์ ํฉ
์นํจ์ง m๊ฐ๋ง ๋จ๊ฒจ์ผ ํจ
๋ง๋ค ์ ์๋ ๊ฐ์ฅ ์์ '๋์์ ์นํจ๊ฑฐ๋ฆฌ'๋?
์๊ฐ๋ณต์ก๋
์ฐธ๊ณ ์ฌ์ดํธ
์ด ๋ฌธ์ ๋ n * n์ ๋ชจ๋ ๊ทธ๋ํ ์์ญ์ ํ์ ํ ํ์๊ฐ ์๋ค. ์ง๊ณผ ์นํจ์ง๋ง ํ์ํ๋ฉด ๋๋ค. ์ง์ 2N๊ฐ, ์ฆ ์ต๋ 100๊ฐ์ด๋ฉฐ, ์นํจ์ง M์ ์ต๋ 13์ด๋ค. ์ด๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์์ํ๋ ์ฐ์ฐํ์ 1์ต๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค. ๋ฐ๋ผ์ ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ(์์ ํ์)์ ์๋ํด๋ด์ง ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์นํจ์ง ์ต๋ 13๊ฐ ์ค์์ M๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ์กฐํฉ์ ์ต๋ ๊ฒฝ์ฐ์ ์๋ 100,000์ ๊ฐ๊น๋ค. (M์ด ์ค๊ฐ๊ฐ 6, 7์ผ ๊ฒฝ์ฐ 100,000์ ๊ฐ๊น๋ค. )
์๊ณ ๋ฆฌ์ฆ : ๊ตฌํ, ๋ธ๋ฃจํธํฌ์ค (์์ ํ์)
- ์นํจ์ง M๊ฐ์ ์กฐํฉ ๊ตฌํ๊ธฐ
- ๋ชจ๋ ์กฐํฉ์ ๋ํ ๋์์ ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
โ๏ธ๋ด ์์ค์ฝ๋
- ๋น์นธ, ์นํจ์ง, ์ง ๊ตฌ๋ถํ๊ธฐ
- ์นํจ์ง M๊ฐ์ ์กฐํฉ ๊ตฌํ๊ธฐ (combinations ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ)
- ๋ชจ๋ ์กฐํฉ์ ๋ํ ๋์์ ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
- ์นํจ ๊ฑฐ๋ฆฌ cl : ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ์ด๋ค. ๋ฐ๋ผ์ ์ง์ผ๋ก๋ถํฐ ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ตฌํ ํ, ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ฅํ๋ค.
- ๋์์ ์นํจ ๊ฑฐ๋ฆฌ ccl : ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋๋ง๋ค ๋์ ํ์ฌ ๋ํ๋ค.
- ๋ชจ๋ ์กฐํฉ์ ๋ํ ๋์์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ , ์ด ์ค ๊ฐ์ฅ ์์ ๊ฐ์ printํ๋ค.
import sys
from itertools import combinations
si = sys.stdin.readline
def get_city_chicken_len(chicken):
ccl = 0
for x, y in houses:
cl = float('inf')
for i, j in chicken:
cl = min(cl, abs(x - i) + abs(y - j))
ccl += cl
return ccl
n, m = map(int, si().split())
houses = []
chickens = []
for i in range(n):
line = si().split()
for j in range(n):
if line[j] == '1':
houses.append([i, j])
elif line[j] == '2':
chickens.append([i, j])
res = float('inf')
for chicken in list(combinations(chickens, m)):
res = min(res, get_city_chicken_len(chicken))
print(res)