먼저 주어진 지도에서 모든 치킨집의 위치를 chicken
에 저장해두고,
chicken = []
for i in range(n):
for j in range(n):
if board[i][j] == 2:
chicken.append((i, j))
itertools
의 combinations()
을 사용하여 모든 경우를 구한다.
리스트 cases
에 m
개의 치킨집을 조합한 모든 케이스가 담겨있다.
cases = list(combinations(chicken, m))
각 케이스마다 tot(도시의 치킨 거리)
를 계산하기 위해 board
에 대해 탐색을 시작한다.
board[x][y]
가 집일 때distance
tot(도시의 치킨 거리)
에 distance
를 누적한다.해당 케이스에 대한 board
의 탐색이 끝나면 answer(도시의 최소 치킨 거리)
를 갱신해준다.
answer = 1e9
for case in cases:
tot = 0
for x in range(n):
for y in range(n):
if board[x][y] == 1:
distance = 1e9
for cx, cy in case:
distance = min(distance, abs(cx-x) + abs(cy-y))
tot += distance
answer = min(answer, tot)
다음 케이스를 탐색하며 최종값을 구한다.
import sys
from itertools import combinations
n, m = map(int, sys.stdin.readline().split())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
chicken = []
for i in range(n):
for j in range(n):
if board[i][j] == 2:
chicken.append((i, j))
answer = 1e9
cases = list(combinations(chicken, m))
for case in cases:
tot = 0
for x in range(n):
for y in range(n):
if board[x][y] == 1:
distance = 1e9
for cx, cy in case:
distance = min(distance, abs(cx-x) + abs(cy-y))
tot += distance
answer = min(answer, tot)
print(answer)