정말 브루트포스하게 풀었다. 하나 하나 따지면서!!
- 도시 정보를 다 보면서 치킨집 위치 찾기. 찾는 김에 개수도 세기
- 치킨집이 M개보다 크면, 치킨집 중 M개 뽑기(순서 상관 없으니 조합) - 치킨집이 M개 이하이면, 따로 뽑을 필요 없음.
- 각각의 경우를 보면서, 도시의 치킨 거리 계산하기. (도시 정보를 쭉 보면서 집을 만나면, 집마다 '치킨 거리' 찾기. 집마다 치킨 거리 찾을 때는, 그 경우에 남겨두기로 한 치킨집들을 다 돌아보면서 젤 가까운 거리를 찾음.)
- 가장 도시의 치킨 거리 작을 때가 정답!
import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())
N, M = MIIS()
city_map = list(list(MIIS()) for _ in range(N))
# 치킨집 위치 찾기
chicken_shop = []
chicken_shop_cnt = 0
for i in range(N):
for j in range(N):
if city_map[i][j] == 2:
chicken_shop.append((i,j))
chicken_shop_cnt += 1
# 치킨집 중 M개만 뽑기(조합)
def pick(depth, before_idx, history):
if depth==M:
remain_chicken_shop.append(tuple(map(int,history.split())))
return
for i in range(before_idx, chicken_shop_cnt):
pick(depth+1, i+1, history + ' '+str(i))
remain_chicken_shop = []
if chicken_shop_cnt > M:
pick(0,0,'')
else:
remain_chicken_shop.append(list(range(chicken_shop_cnt)))
ans = 1000000000
# 각각 경우 보면서 도시의 치킨 거리 보기
for i in range(len(remain_chicken_shop)):
chicken_dist = 0
# 각 집
for j in range(N):
for k in range(N):
if city_map[j][k]==1: # 집마다 '치킨 거리' 찾기
chicken_dist_per_house = 100000
for chicken_house_idx in remain_chicken_shop[i]: # 집에서 어떤 치킨 집이 젤 가깝나
chicken_house = chicken_shop[chicken_house_idx]
chicken_dist_per_house = min(chicken_dist_per_house, abs(chicken_house[0]-j)+abs(chicken_house[1]-k))
chicken_dist += chicken_dist_per_house
ans = min(ans, chicken_dist) # 각 경우(어떤 치킨집 M개 남겨두나)에 따라 도시 치킨 거리 업데이트
# 도시의 치킨 거리 최소-> 정답
print(ans)
728x90
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 23740: 버스 노선 개편하기 (0) | 2021.12.01 |
---|---|
[백준-파이썬] 2343: 기타 레슨 (0) | 2021.11.20 |
[백준-파이썬] 1897: 토달기 (0) | 2021.11.12 |
[백준-파이썬] 1600: 말이 되고픈 원숭이 (2) | 2021.11.10 |
[백준-파이썬] 1182: 부분수열의 합 (0) | 2021.11.07 |