문제
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 |