알고리즘 풀이/백준

[ 백준 15686 ] 치킨 배달 - Python

12.tka 2020. 6. 5. 19:04
728x90

문제 보기

이 문제는 완전 탐색 문제이다.

 

치킨 집의 위치 중에서 M개를 고른 모든 경우의 수를 탐색하면 된다.

 

알고리즘 순서는 다음과 같다.

1. 치킨 집의 위치를 저장한다.

2. 치킨 집의 위치 중 M개를 고른다. (조합)

3. 치킨 거리를 계산하고 최솟값을 계속해서 업데이트한다.

  - (x1, y1)과 (x2, y2) 거리 -> abs(x2 - x1) + abs(y2 - y1)

 

코드

import itertools, sys, copy
if __name__ == "__main__":
    N, M = map(int, input().split())
    arr = [list(map(int, input().split())) for _ in range(N)]

    # 치킨집 탐색
    chicken = []
    for i in range(N):
        for j in range(N):
            if arr[i][j] == 2:
                chicken.append([i, j])
                arr[i][j] = 0  # 빈 칸으로 수정

    # 치킨집 중에 M개 고르기(조합)
    result = list(itertools.combinations(chicken, M))

    # 탐색
    min_distance = sys.maxsize
    for i in range(len(result)):
        distance = 0
        for m in range(N):
            for n in range(N):
                if arr[m][n] == 1:
                    temp = sys.maxsize
                    for j in range(M):
                        temp = min(temp, abs(m - result[i][j][0]) + abs(n - result[i][j][1]))
                    distance += temp
        min_distance = min(min_distance, distance)

    # 출력
    print(min_distance)
728x90