[BOJ] 백준 15686 - 치킨 배달
👩🏻💻 문제
👩🏻💻 정답 코드
from itertools import combinations
n, m = map(int, input().split())
chicken = []
house = []
for i in range(n):
s = input().split()
for j in range(n):
if s[j] == '1':
house.append((i, j))
elif s[j] == '2':
chicken.append((i, j))
result = []
for i in list(combinations(chicken, m)):
r = 0
for hy, hx in house:
dist = []
for cy, cx in i:
dist.append(abs(hy-cy)+abs(hx-cx))
r += min(dist)
result.append(r)
print(min(result))
처음에는 치킨 거리가 제일 많은 치킨집을 남기는 걸로 해야 하나 했는데 그렇게 했는데도 틀린 경우가 있을 것 같아서 찾아보다가 itertools의 combinations를 써서 중복 없는 조합을 구해 각 경우 중 min 값을 내면 되는 걸 깨달았다. 라이브러리 활용 잘 할 것... 파이썬 정리 한 번 해야겠다
그래서 프로세스는
- 집, 치킨집 위치를 일단 chicken, house리스트에 저장해두고
for i in list(combinations(chicken, m))
으로 치킨 가게 중m
개의 조합의 경우의 수를 반복문을 돌아서- 한 집씩 차례차례 각 치킨집에 대한 치킨 거리를 구해서
dist
리스트에 저장해놓은 다음- 그 중
min
값을 도시의 치킨 거리인r
에 더한다.- 모든 집에 대한 치킨 거리가
r
에 더해지면result
리스트에 추가- 그렇게 각 치킨집
m
개에 대한 조합의 치킨 거리 중min
값을 프린트
👩🏻💻 Remember
from itertools import combinations
for i in list(combinations(chicken, m)):
...
for cy, cx in i:
# m개의 치킨집 조합의 각 치킨집 좌표 반복
라이브러리 잘 외워 두고 적극 활용하기!!!
Author And Source
이 문제에 관하여([BOJ] 백준 15686 - 치킨 배달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dazzlynn/BOJ-백준-15686-치킨-배달저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)