오늘의 문제는 치킨 배달이라는 문제이다. (골드 5)
DFS를 통해서 해결방법을 구현하였다.
해결 코드이다.
import sys
input=sys.stdin.readline
def dist(a,b):
return abs(a[0]-b[0])+abs(a[1]-b[1])
n,m=map(int,input().split())
data=[]
for i in range(n):
data.append(list(map(int,input().split())))
chicken=[]
house=[]
for i in range(n):
for j in range(n):
if data[i][j]==1:
house.append([i,j])
elif data[i][j]==2:
chicken.append([i,j])
dists=[]
for i in range(len(house)):
tempL=list()
for j in range(len(chicken)):
tempL.append(dist(house[i],chicken[j]))
dists.append(tempL)
score=1e10
visited=[False]*len(dists[0])
def dfs(temp,latest):
global score
if len(temp)==m:
setscore=0
for n1 in range(len(dists)):
comp=1e10
for n2 in range(len(dists[0])):
if n2 in temp:
comp=min(comp,dists[n1][n2])
setscore+=comp
score=min(setscore,score)
return
for i in range(latest,len(dists[0])):
if not visited[i]:
visited[i]=True
temp.append(i)
latest+=1
dfs(temp,latest)
visited[i]=False
temp.pop()
dfs([],0)
print(score)
하나하나 보자면, dist()라는 함수는 두 좌표 사이의 거리를 구하는 함수이다.
수학 용어 중에 '택시 거리'라 하여, 두 좌표의 거리를 x좌표끼리, y좌표끼리의 차를 합하여 구하는 거리이다.
우선 모든 좌표들을 input을 받고, 일반 집과 치킨 집의 좌표를 리스트에 넣는다.
이후 집에서 모든 치킨 집 까지의 거리를 구하고, dists라는 리스트에 포함시켰다.
여기서 살려야 할 (폐업하지 않아야 할) 치킨집들을 combination, 조합을 통해 구현하여 최저거리를 구했다.
처음에는 어려웠지만, 막상 풀면 기본적인 알고리즘을 통해 해결할 수 있었다.
'Computer Science > Algorithm' 카테고리의 다른 글
BOJ 26217: 별꽃의 세레나데 (Easy) (0) | 2022.12.18 |
---|---|
BOJ 11286: 절댓값 힙 [Python 3] (0) | 2022.12.15 |
BOJ 16987: 계란으로 계란치기 [Python 3] (0) | 2022.11.23 |
BOJ 14889: 스타트와 링크 (Python3) (0) | 2022.11.16 |
BOJ 10972: 다음 순열 (0) | 2022.02.08 |