개발하는 두부

[BOJ] 15686.치킨배달 (Python)

by 뚜부니

 

 

15686번: 치킨 배달

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

www.acmicpc.net

 

이 문제에서는 NxN 크기의 도시가 주어지며, 도시의 각 칸은 빈 칸(0), 집(1), 치킨집(2) 중 하나로 구성되어 있습니다.

치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이며, 도시의 치킨 거리는 모든 집의 치킨 거리 합입니다.

거리 d = |r1 - r2| + |c1 -c2| 로 구합니다.

도시에 있는 치킨집 중 최대 M개를 고르고 나머지는 폐업시킬 때, 도시의 치킨 거리 최소값을 출력하는 문제입니다.

 

치킨집을 M개씩 조합을 통해 만들고,

각 조합에 대한 도시의 치킨 거리를 구하며 최솟값을 찾는 방식으로 문제를 풀었습니다.

 

# 치킨배달
import sys

def distance(chicken) : # 거리를 계산하는 함수
    dist = 0
    for r1, c1 in home :
        dist += min([(abs(r1-r2) + abs(c1-c2)) for r2, c2 in chicken])
    return dist

def dfs(L, cur) : # 조합을 만들어 치킨 거리의 최솟값을 찾는 함수
    global min_dist
    if L == M :
        select_chicken = [chicken[i] for i in range(chilen) if visited[i]]
        min_dist = min(min_dist, distance(select_chicken))
        return
    
    for i in range(cur, chilen) :
        if visited[i] == 0 :
            visited[i] = 1
            dfs(L + 1, i + 1)
            visited[i] = 0

if __name__=="__main__" : 
    input = sys.stdin.readline

    N, M = map(int, input().split()) # 도시 크기, 치킨집 개수
    city = [] # 도시
    chicken = [] # 치킨집
    home = [] # 집

    for r in range(N) :
        temp = list(map(int, input().split()))
        city.append(temp) # 도시의 각 행에 대한 정보 추가
        for c in range(N) :
            if temp[c] == 2 :# 치킨집인 경우
                chicken.append((r,c))
            elif temp[c] == 1 : # 집인 경우
                home.append((r,c))
    
    if len(chicken) == M : # 이미 M개이므로 치킨집을 폐업시킬 필요가 없음
        print(distance(chicken))
    else : # M개씩 조합을 만들어 도시의 치킨 거리의 최솟값을 찾아야 함
        min_dist = 2147000000 # 대략적인 큰 수로 도시의 치킨 거리 초기화
        chilen = len(chicken)
        visited = [0] * chilen
        dfs(0, 0)
        print(min_dist)

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 15685.드래곤커브 (Python)  (0) 2021.04.23
[BOJ] 17406.배열돌리기4  (0) 2021.04.22
[BOJ] 17140.이차원배열과 연산 (Python)  (0) 2021.04.21
[BOJ] 14890.경사로 (Python)  (0) 2021.04.20
[BOJ] 1929.소수구하기 (Python)  (0) 2021.04.19

블로그의 정보

개발하는 두부

뚜부니

활동하기