Development/Algorithm

[백준] 15686번: 치킨 배달 (python)

jstar0525 2021. 5. 4. 07:00
반응형

www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

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

www.acmicpc.net

import sys
import itertools
    
def find_location(city, N):
    
    home = []
    chicken = []
    
    for r in range(N):
        for c in range(N):
            if city[r][c] == 1:
                home.append([r,c])
            elif city[r][c] == 2:
                chicken.append([r,c])
                
    return home, chicken
                
def cal_distance(home, chicken, n):
    
    home_distance = []
    
    for h in home:
        tmp = 2*n
        for c in chicken:
            tmp_n = abs(h[0]-c[0]) + abs(h[1]-c[1])
            if tmp_n < tmp:
                tmp = tmp_n
        home_distance.append(tmp)
        
    city_distance = sum(home_distance)
    
    return city_distance

def sel_chicken(m, chicken):
    
    possible_chicken = []
    
    for get in range(1,m+1):
        possible_chicken = possible_chicken + list(itertools.combinations(chicken,get))
        
    return possible_chicken

if __name__ == '__main__':

    N, M = map(int, input().split())
    city = [list(map(int,sys.stdin.readline().split())) for _ in range(N)]

    home, chicken = find_location(city, N)
    possible_chicken = sel_chicken(M, chicken)

    possible_dist = []

    for c in possible_chicken:
        possible_dist.append(cal_distance(home, c, N))
        
    print(min(possible_dist))
반응형