ํ’€์ด


์ฃผ์–ด์ง„ ํฌ๊ธฐ์˜ NxN ๋„์‹œ์—์„œ ์น˜ํ‚จ์ง‘์„ M๊ฐœ๋งŒํผ๋งŒ ๋‚จ๊ฒผ์„ ๋•Œ ์ง‘๋งˆ๋‹ค ์ตœ์†Œ๊ฑฐ๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋‹ค.itertools ์˜ combinations ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด ์ฃผ์–ด์ง„ ์น˜ํ‚จ์ง‘ ์กฐํ•ฉ์„ ์ฐพ๊ณ  ๊ฐ ์กฐํ•ฉ๋งˆ๋‹ค ๊ฐ ์ง‘๋“ค์˜ ์ตœ์†Œ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ค ํ•ฉํ•ด์„œ ๊ทธ ์ค‘ ์ œ์ผ ์ ์€ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ด์•ผํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 1, 2, 3๋ฒˆ ์น˜ํ‚จ์ง‘์ด ์žˆ๊ณ  M ์ด 2์ผ ๊ฒฝ์šฐ.(1, 2), (1, 3), (2, 3) ์ด 3๊ฐ€์ง€ ์กฐํ•ฉ์ด ์ƒ๊ธฐ๋Š”๋ฐ์ง‘๋งˆ๋‹ค 1๋ฒˆ๊ณผ 2๋ฒˆ ์น˜ํ‚จ์ง‘ ์ค‘ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ๋ฅผ comb_min ์— ๋”ํ•ด์ค€๋‹ค.๋ชจ๋“ ์ง‘๋“ค์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด 1๋ฒˆ์งธ ์กฐํ•ฉ์— ๋Œ€ํ•œ ์น˜ํ‚จ๊ฑฐ๋ฆฌ ์ฆ‰ ans ๊ฐ€ ๋‚˜์˜จ๋‹ค.

์ด ์ž‘์—…์„ ๊ฐ ์กฐํ•ฉ๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ์ตœ์†Œ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ด ์ถœ๋ ฅํ•˜๋ฉด๋œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ


from itertools import combinations
import sys
input = sys.stdin.readline
 
N, M = map(int, input().split())
town = []
house = []
chicken = []
 
for i in range(N):
    t = list(map(int, input().split()))
    town.append(t)
    for j in range(N):
        if t[j] == 1:
            house.append((i, j))
        elif t[j] == 2:
            chicken.append((i, j))
 
comb = combinations(chicken, M)
ans = float("inf")
 
for c in comb:  # ๊ฐ€๋Šฅํ•œ ์น˜ํ‚จ์ง‘ ๊ฒฝ์šฐ์˜ ์ˆ˜
    comb_min = 0
    for i, j in house:
        min_dis = float("inf")
        for x, y in c:
            chi_dis = abs(x-i) + abs(y-j)  # ๊ฐ ์น˜ํ‚จ์ง‘๊ณผ ์ง‘๊ฐ„์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ
            min_dis = min(chi_dis, min_dis)  # ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ์ตœ์†Œ ์น˜ํ‚จ๊ฑฐ๋ฆฌ
        comb_min += min_dis  # ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ๋ชจ๋“  ์ง‘๊ฐ„์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ
    ans = min(ans, comb_min)  # ์ตœ์†Œ ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ์กฐํ•ฉ
 
print(ans)

References