본문 바로가기

알고리즘/삼성 기출

치킨 배달 [백준 15686번]

문제

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

 

15686번: 치킨 배달

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

www.acmicpc.net

 

내 풀이

 

나도 combinations 써서 구현할까 하다가 재귀 함수 연습할 겸 재귀로 풀어보았다.

 

재귀 함수 백트래킹을 사용하여 치킨집 중에서 M개를 선택하였다.

선택된 치킨집과 집과의 거리를 구하였다.

 

import sys, math
input = sys.stdin.readline

N, M = map(int, input().strip().split())
city, house, chick = [], [], []
for i in range(N):
    city.append(list(map(int, input().strip().split())))
    for j in range(N):
        if city[i][j] == 1:
            house.append((i, j))
        elif city[i][j] == 2:
            chick.append((i, j))

MIN = math.inf
check = [False]*len(chick)
def dfs(arr):
    global MIN
    if len(arr) == M:
        dist = 0
        for h in house:
            md = math.inf
            for idx in arr:
                d = abs(h[0]-chick[idx][0]) + abs(h[1]-chick[idx][1])
                md = min(md, d)
            dist += md
        MIN = min(MIN, dist)        
        return
    for i in range(len(chick)):
        if not check[i] and (not arr or arr[-1] < i):
            check[i] = True
            arr.append(i)
            dfs(arr)
            arr.pop()
            check[i] = False
dfs([])
print(MIN)

 

총평

빡구현이다. 삼성 문제 치고 풀만하다.

'알고리즘 > 삼성 기출' 카테고리의 다른 글

감시 [백준 15683번]  (0) 2022.10.05
인구 이동 [백준 16234번]  (0) 2022.10.01
퇴사 [백준 14501번]  (0) 2022.09.22
테트로미노 [백준 14500번]  (0) 2022.09.19
로봇 청소기 [백준 14503번]  (1) 2022.09.16