모눈종이에 사각사각

[백준 15686] 치킨 배달 본문

CodingTest/Baekjoon

[백준 15686] 치킨 배달

모눈종이씨 2022. 4. 21. 22:24

🍎 [백준 15686] 치킨 배달

문제 링크

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

 

15686번: 치킨 배달

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

www.acmicpc.net

 

 

⚾ 코드

from itertools import combinations

n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]

chickens = []
homes = []

for i in range(n):
    for j in range(n):
        if grid[i][j] == 1:
            homes.append([i, j])
        elif grid[i][j] == 2:
            chickens.append([i, j])

chicken_load = n**3
chicken_list = combinations(chickens, m) # 조합을 이용해 치킨 집을 m개 고름

for chicken in chicken_list:
    # chicken -> 치킨집 중 m개 고름
    min_dist = [n*2]*len(homes)
    for i in range(len(homes)):  # 집을 순회하면서
        for a, b in chicken:  # m개의 치킨집과의 거리를 계산.
            if abs(homes[i][0]-a)+abs(homes[i][1]-b) < min_dist[i]:
                min_dist[i] = abs(homes[i][0]-a)+abs(homes[i][1]-b)

    if chicken_load > sum(min_dist): # 각 집의 치킨 거리의 합 = chicken load
        chicken_load = sum(min_dist)

print(chicken_load)

 

 

🔔 해결 과정 & 깨달은 점

- 문제 중에 m개의 치킨 집을 보고 바로 조합을 떠올렸다.

- graph를 순회하면서 집과 치킨 집을 리스트에 저장했다.

- 그리고 m개의 치킨집을 선택하고, 각 집을 순회하면서 치킨집과의 거리 중 최단 거리를 저장했다.

- 각 집을 순회하는 루프가 끝났을 때, 각 집의 치킨 거리를 계산하여, chicken_load보다 짧을 경우 갱신해주었다. 이렇게 되면 최소 치킨 거리가 나온다. 

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 2470] 두 용액  (0) 2022.05.12
[백준 20922] 겹치는 건 싫어  (0) 2022.05.11
[백준 1719] 택배  (0) 2022.04.12
[백준 9466] 텀 프로젝트  (0) 2022.04.11
[백준 13549] 숨바꼭질3  (0) 2022.04.08
Comments