💻 입력 조건
💻 출력 조건
💻 입력 예시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
💻 입력 예시2
5 2 0 2 0 1 0 1 0 1 0 0 0 0 0 0 0 2 0 0 1 1 2 2 0 1 2
💻 출력 예시2
10
💻 입력 예시3
5 1 1 2 0 0 0 1 2 0 0 0 1 2 0 0 0 1 2 0 0 0 1 2 0 0 0
💻 출력 예시3
11
💻 입력 예시4
5 1 1 2 0 2 1 1 2 0 2 1 1 2 0 2 1 1 2 0 2 1 1 2 0 2 1
💻 출력 예시4
32
📖 문제 해결
distance
함수와 min_distance
함수를 이용하여 치킨집과 집과의 거리를 구하고, 그중에서도 가장 가까운 치킨집과의 거리를 구할 수 있도록 하였습니다. 그리고 itertools
모듈 내의 combinations
함수를 이용하여 폐업시키지 않을 치킨집들의 가능한 모든 조합들에 대해서 치킨 거리의 합을 모두 계산할 수 있도록 하였고, 그중 가장 치킨 거리의 합이 작은 경우의 값을 출력할 수 있도록 하였습니다.
# n, m 입력받기
n, m = list(map(int,input().split()))
# 도시의 정보 입력받기
map_ = []
for i in range(n):
map_.append(list(map(int,input().split())))
# house_coordis에 집들의 좌표를 저장
house_coordis = []
# chicken_coordis에 치킨집들의 좌표를 저장
chicken_coordis = []
for r_idx, row in enumerate(map_):
for c_idx, col in enumerate(row):
if map_[r_idx][c_idx] == 1:
house_coordis.append((r_idx,c_idx))
elif map_[r_idx][c_idx] == 2:
chicken_coordis.append((r_idx,c_idx))
# 치킨 거리를 구하는 함수
def distance(coordi1,coordi2):
return abs(coordi1[0]-coordi2[0]) + abs(coordi1[1]-coordi2[1])
# 가장 가까운 치킨집과의 거리를 구하는 함수
def min_distance(house_coordis, chicken_coordis):
distance_count = 0
for house_coordi in house_coordis:
min_dis = []
for chicken_coordi in chicken_coordis:
min_dis.append(distance(house_coordi,chicken_coordi))
distance_count += min(min_dis)
return distance_count
from itertools import combinations
# 폐업시키지 않을 치킨집 m개를 고르는 모든 경우의 수 구하기
c_combinations = combinations(chicken_coordis, m)
# 모든 경우들에 대하여 치킨 거리를 구하고 answer 리스트에 추가
answer = []
for c_combi in c_combinations:
answer.append(min_distance(house_coordis, c_combi))
# 치킨 거리의 최솟값을 출력
print(min(answer))