๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜

[baekjoon] 15686 ์น˜ํ‚จ ๋ฐฐ๋‹ฌ (python3)

be__simon 2021. 7. 26. 16:27

๋ฌธ์ œ


์ง‘-์น˜ํ‚จ์ง‘์˜ ๊ฑฐ๋ฆฌ๋Š” ๋งจํ•˜ํƒ„ ๊ฑฐ๋ฆฌ๋กœ ๊ตฌํ•œ๋‹ค. ( |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