์ผ์ฑ SW ์ญ๋ ํ ์คํธ ๊ธฐ์ถ ๋ฌธ์ - 15686๋ฒ ์นํจ ๋ฐฐ๋ฌ
๋ฌธ์
ํฌ๊ธฐ๊ฐ N×N์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค.
์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ "์นํจ ๊ฑฐ๋ฆฌ"๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค.
์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
(2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค.
(5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค.
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒ ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 13)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๋์์ ์ ๋ณด๋ 0, 1, 2๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํ๋ค. ์ง์ ๊ฐ์๋ 2N๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ์ ์ด๋ 1๊ฐ๋ ์กด์ฌํ๋ค. ์นํจ์ง์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 13๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ1
5 3
0 0 1 0 0
0 0 2 0 1
0 1 2 0 0
0 0 1 0 0
0 0 0 0 2
์์ ์ถ๋ ฅ1
5
ํ์ด
- ์ ๋๊ฐ ๊ตฌํ๊ธฐ : abs() ํจ์ ์ฌ์ฉ
- itertools ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ combinations ์ฌ์ฉ - ์กฐํฉ ์ฌ์ฉ
๋ฐฉ๋ฒ 1) ๋ฐฑํธ๋ํน์ผ๋ก ํ๊ธฐ
- ์กฐํฉ์ ๋ฐฑํธ๋ํน์ผ๋ก ๊ตฌํด์ฃผ์๋ค. select์ ์นํจ์ง์ ๋ฃ์ด์ฃผ๋ค๊ฐ m๊ฐ์ ๊ฐ์์ง๋ฉด ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ณ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๋ค. result๋ ์ต์๊ฐ์ ๋ฐํํ๋ค
import sys
n, m = map(int, input().split())
city = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
house = []
chicken = []
# ์ง๊ณผ ์นํจ์ง์ ์ขํ๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅ
for i in range(n):
for j in range(n):
if city[i][j] == 1:
house.append([i, j])
elif city[i][j] == 2:
chicken.append([i, j])
# ๋ฐฉ๋ฒ1) ๋ฐฑํธ๋ํน์ผ๋ก ํ๊ธฐ
# depth: ๊ณ ๋ฅธ ์นํจ์ง ์, i: ๊ณ ๋ฅธ ์นํจ์ง ๋ฒํธ
def back(depth, i):
global result
chicken_total_dist = 0
# ์นํจ์ง m๊ฐ๋ฅผ ๊ณจ๋๋ค๋ฉด ์นํจ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
if depth == m:
for h in house:
chicken_dist = int(1e9)
for c in select:
chicken_dist = min(chicken_dist, abs(h[0] - c[0]) + abs(h[1] - c[1]))
chicken_total_dist += chicken_dist
result = min(chicken_total_dist, result)
return
# ๊ณ ๋ฅธ ์นํจ ์ง์ ์ ์ธํ๊ณ back
for idx in range(i, K):
select.append(chicken[idx])
back(depth + 1, idx + 1)
select.pop()
select = []
K = len(chicken) # ์ด ์นํจ์ง ์
result = int(1e9)
# ์กฐํฉ ์์
for t in range(K):
back(0, t)
print(result)
๋ฐฉ๋ฒ 2) ์กฐํฉ์ผ๋ก ํ๊ธฐ
- m๊ฐ๋ฅผ ์ ํํ๋ ๋ชจ๋ ์กฐํฉ์ ๋ํด ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
- ๊ทธ ์ค ์ต์๊ฐ ์ ํ
# ์ผ์ฑ SW ์ญ๋ ํ
์คํธ ๊ธฐ์ถ ๋ฌธ์
# ๋ฐฑ์ค 15868๋ฒ. ์นํจ ๋ฐฐ๋ฌ
import sys
from itertools import combinations
n, m = map(int, input().split())
city = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
house = []
chicken = []
# ์ง๊ณผ ์นํจ์ง์ ์ขํ๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅ
for i in range(n):
for j in range(n):
if city[i][j] == 1:
house.append([i, j])
elif city[i][j] == 2:
chicken.append([i, j])
# ๋ฐฉ๋ฒ2) ์กฐํฉ์ผ๋ก ํ๊ธฐ
# m๊ฐ์ ์นํจ์ง ์ ํ
result = sys.maxsize
for c in combinations(chicken, m):
temp = 0
for h in house:
distance = sys.maxsize
for i in range(m):
# ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
distance = min(distance, abs(h[0] - c[i][0]) + abs(h[1] - c[i][1]))
temp += distance
result = min(result, temp)
print(result)
์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ
- ๊ตฌํ
- ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑํธ๋ํน
์ฐธ๊ณ ์ฌ์ดํธ