치킨 배달

m개의 치킨집을 골라낸 후, 각 집의 치킨 거리합을 구한다. 이때, m개의 치킨집을 고른 경우들 중, 가장 작은 도시의 치킨 거리를 구하는 문제이다.

집과 치킨집의 좌표들을 ‘house’와 ‘chicken’에 dictonary를 이용해 저장했다. 탐색하며 나오는 첫 번째 집의 좌표를 house[0]에 입력하고, 두 번째 집의 좌표를 house[1]에 입력하는 식으로 저장했다. 치킨집도 마찬가지이다. m개의 chicken집을 추릴 때, index만 사용해서 조금 더 간단하게 DFS를 진행하기 위해 이 방식을 사용해 저장했다. (combination을 사용할 수도 있지만, DFS를 이용해 풀었다.) 이 과정은 평범한 DFS임으로, 밑의 코드를 참고하면 쉽게 이해할 수 있을 것이다.


이제, 골라진 m개의 치킨집에 대해서 도시의 치킨 거리를 구해야한다.

def DIST(chicken_list):
    dist_sum = 0

    for j in range(cnt_house+1):
        a, b = house[j]
        dist = sys.maxsize
        for i in chicken_list:
            x, y = chicken[i]
            dist = min(dist, abs(x-a)+abs(y-b))
        dist_sum += dist

    return dist_sum

DFS를 수행해서 얻은 m개 치킨집의 리스트를 인자로 받았다. 각각의 집에 대해 초기 치킨 거리를 파이썬의 정수형 최대값으로 설정해준다. 모든 치킨집에 대해 x축, y축 좌표값을 비교해 거리를 구하고, 이 거리들의 최소값을 ‘dist_sum’에 더해주었다.

모든 집의 치킨거리를 더한 ‘dist_sum’이 최종적으로 도시의 치킨 거리가 된다.

이 ‘dist_sum’들의 최소값을 찾아 출력하자.


CODE

from collections import deque
import sys
read = sys.stdin.readline
answer = sys.maxsize

n, m = map(int, read().split())
MAP = list(list(map(int, read().split())) for _ in range(n))

# 치킨집과 집들의 좌표 저장
chicken = dict()
house = dict()
# dictionary에 치킨집과 집들을 0번부터 번호를 매기기 위해 사용
cnt_chicken = -1
cnt_house = -1

for i in range(n):
    for j in range(n):
        if MAP[i][j] == 2:
            cnt_chicken += 1
            chicken[cnt_chicken] = (i, j)
        if MAP[i][j] == 1:
            cnt_house += 1
            house[cnt_house] = (i, j)

# 치킨집을 m개만큼 골라낸후, 치킨거리의 최소값을 answer에 저장한다.
def DFS(chicken_list, index, count):
    global answer
    if count == m:
        answer = min(answer, DIST(chicken_list))
    else:
        for i in range(index, cnt_chicken+1):
            DFS(chicken_list+[i], i+1, count+1)

# 골라진 m개의 치킨집에 대해 각각의 집들로 부터의 치킨 거리를 구한다.
def DIST(chicken_list):
    dist_sum = 0

    for j in range(cnt_house+1):
        a, b = house[j]
        dist = sys.maxsize
        for i in chicken_list:
            x, y = chicken[i]
            dist = min(dist, abs(x-a)+abs(y-b))
        dist_sum += dist

    return dist_sum

DFS([], 0, 0)
print(answer)


틀린 부분이 있을 수 있습니다. 피드백 주시면 고치도록 하겠습니다! 감사합니다.👍

[꼭 다시 풀어보기]