Coding Test/BaekJoon_Python
백준 15686 <치킨 배달> Python
JunOnJuly
2023. 11. 23. 18:13
728x90
https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
데이터의 사이즈가 작은 편이기 때문에 모든 경우를 돌아가면서 거리를 구해보고 비교하면 쉽게 풀 수 있습니다.
from itertools import combinations
def solution(N, M, data_list):
# 치킨집 리스트, 집 리스트 정리
all_chick_list = []
house_list = []
for i in range(N):
for j in range(N):
if data_list[i][j] == 1:
house_list.append([i, j])
elif data_list[i][j] == 2:
all_chick_list.append([i, j])
# 도시의 치킨 거리
city_chick_dist = 1300
# 가능한 조합을 돌아가면서 도시의 치킨 거리 구함
for chick_list in combinations(all_chick_list, M):
# 현재 조합의 도시의 치킨 거리
temp_city_chick_dist = 0
for house in house_list:
# 치킨 거리들을 더함
temp_city_chick_dist += find_chick_dist(house, chick_list)
# 도시의 치킨 거리 최신화
if city_chick_dist > temp_city_chick_dist:
city_chick_dist = temp_city_chick_dist
return city_chick_dist
# 치킨 거리를 구하는 함수
def find_chick_dist(house, chick_list):
# 치킨 거리
chick_dist = 100
# 순회하면서 업데이트
for chick in chick_list:
# 거리 계산
dist = cal_dist(house, chick)
if dist < chick_dist:
chick_dist = dist
return chick_dist
# 거리를 구하는 함수
def cal_dist(idx1, idx2):
# 좌표 정리
x1, y1 = idx1
x2, y2 = idx2
return abs(x1-x2) + abs(y1-y2)
N, M = map(int, input().split())
data_list = [list(map(int, input().split())) for _ in range(N)]
print(solution(N, M, data_list))
728x90