프로그래밍/Python

백준_python 15686번 치킨 배달(combiantions, 백트래킹)

O'bin 2024. 6. 13. 23:46

<문제 링크>

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

 

15686번: 치킨 배달

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

www.acmicpc.net

 

 

 

 

<정답 코드>

sol1) itertools.combinations 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from itertools import combinations
 
# 입력
n, m = map(int, input().split())
town = [list(map(int, input().split())) for _ in range(n)]
 
# 초기화
house = []
store = []
chicken_distance = 9999
 
# 집, 치킨집 위치 추출
for i in range(n):
    for j in range(n):
        if town[i][j] == 1:
            house.append((i, j))
        elif town[i][j] == 2:
            store.append((i, j))
 
# 치킨집 조합별 최소 치킨 거리 계산
for chicken_comb in combinations(store, m):
    tmp = 0
    for h in house:
        # 해당 집에서 가까운 치킨거리 계산
        min_dis = 999
        for c in chicken_comb:
            dis = abs(h[0- c[0]) + abs(h[1- c[1])
            min_dis = min(min_dis, dis)
        tmp += min_dis
 
    #결과값 업데이트
    chicken_distance = min(chicken_distance, tmp)
 
print(chicken_distance)
cs