๋ฌธ์
์ง-์นํจ์ง์ ๊ฑฐ๋ฆฌ๋ ๋งจํํ ๊ฑฐ๋ฆฌ๋ก ๊ตฌํ๋ค. ( |x1 - y1| + |x2 - y2| )์ด๋ค ์ง์ ์นํจ ๊ฑฐ๋ฆฌ
๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ์ด๊ณ , ๋ชจ๋ ์ง๋ค์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด ๋์์ ์นํจ๊ฑฐ๋ฆฌ
์ด๋ค.
์ด ๋ ๋์์ ์นํจ๊ฑฐ๋ฆฌ๊ฐ ์ต์๊ฐ ๋๋๋ก ์นํจ ์ง์ m๊ฐ ๊ณจ๋ผ์ผํ๋ค.
์ ๊ทผ๋ฒ
1 <= m <= ์นํจ์ง <= 13
์ด๊ธฐ ๋๋ฌธ์ ๋จ์ํ ์นํจ์ง์ m๊ฐ ๊ณจ๋ผ๋ ์ต๋ 13 \choose 6 = 1716 ๊ฐ์ง ๋ฐ์ ์๋ค.
๋์์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ k๊ฐ์ ์ง์ ๋ํด m๊ฐ์ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด์ผํ๋ฏ๋ก O(km)
k <= 2N <= 100
์ด๋ฏ๋ก combination์ ๊ฒฝ์ฐ์ ์ * O(km)
์ ํด๋ 1300 * 1716 ์ด ์ต๋์ผ ๊ฒ
๋ฐ๋ผ์ ๊ทธ๋ฅ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ๋์์ ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ ๋ ๊ฒ ๊ฐ๋ค.
code
๋์์ ์ ๋ณด๊ฐ 2์ฐจ์ ๋ฐฐ์ด ํํ๋ก ์ฃผ์ด์ง๋ฉด ์ง๊ณผ ์นํจ์ง์ ์์น๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅํด๋๋ค.
์ ์ฅ๋ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
from itertools import combinations
n, m = map(int, input().split())
homes = []
chickens = []
for i in range(n):
l = input().split()
for j in range(n):
if l[j] == '1':
homes.append((i, j))
elif l[j] == '2':
chickens.append((i, j))
def get_chic_dist(h, c):
return abs(h[0] - c[0]) + abs(h[1] - c[1])
answer = -1
for chic_case in combinations(chickens, m):
# m๊ฐ์ ์นํจ์ง์ ๊ณ ๋ฅด๊ณ ๊ฐ ์ผ์ด์ค์ ๋ํ ์ฐ์ฐ
sum = 0
for h in homes: # ์ง์ง ๋ง๋ค ์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
mind = -1
for c in chic_case:
d = get_chic_dist(h, c)
mind = d if mind == -1 else min(mind, d)
sum += mind
answer = sum if answer == -1 else min(answer, sum)
print(answer)
๊ฑด์ ํ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค :D
'๐ค ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[baekjoon] 1162 ๋๋กํฌ์ฅ (0) | 2021.08.05 |
---|---|
[baekjoon] 2243 ์ฌํ ์์ (cpp) (0) | 2021.08.03 |
[baekjoon] 11003 ์ต์๊ฐ ์ฐพ๊ธฐ (python) (0) | 2021.07.27 |
[baekjoon] 1806 ๋ถ๋ถํฉ (python) (0) | 2021.07.27 |
[baekjoon] 2580 ์ค๋์ฟ (python) (0) | 2021.07.26 |