# Coding/# 백준

[백준 / 15686] 치킨 배달 - Python

강현들 2021. 12. 21. 11:03
728x90
반응형

https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

 

<풀이>

치킨집을 M개만큼 골라아한다 -> 조합(combination)

치킨집 M개를 고른 모든 경우를 계산해준다.

 

<전체 코드>

def combi(N, start, end, prev=[]):
    all_set = []

    numList = [i for i in range(start, end)]
    for i in numList:
        temp = prev[:]
        temp.append(i)
        if N == 1:
            all_set.append(temp)
        else:
            all_set.extend(combi(N-1, i+1, end, temp))

    return all_set


N, M = map(int, input().split())


graph = []

for _ in range(N):
    graph.append(list(map(int, input().split())))

house = []
chicken = []

for i in range(N):
    for j in range(N):
        if graph[i][j] == 1:
            house.append([i, j])
        elif graph[i][j] == 2:
            chicken.append([i, j])

distance_chicken = {}
for i in range(len(chicken)):
    distance_chicken[i] = []
    for j in range(len(house)):
        distance_chicken[i].append(abs(chicken[i][0]-house[j][0]) +
                                   abs(chicken[i][1]-house[j][1]))

for_list = combi(M, 0, len(distance_chicken))

map_dis = float('inf')
for i in for_list:
    temp = 0

    for j in range(len(house)):  # 집 개수만큼
        mindis = float('inf')
        for k in i:  # 치킨집 개수
            if mindis > distance_chicken[k][j]:
                mindis = distance_chicken[k][j]
        temp += mindis
    if temp < map_dis:
        map_dis = temp

print(map_dis)
728x90
반응형