이코테 p332입니다.
import sys
from itertools import combinations
input = sys.stdin.readline
city = []
N, M = map(int, input().split()) # 50, 13 N^2 -> 2500
for _ in range(N):
city.append(list(map(int, input().split())))
homes = []
chickens = []
#home chicken 위치를 넣는다. # O(N^2) N -> 최대 50
for i in range(N):
for j in range(N):
if city[i][j] == 1:
homes.append((i, j))
elif city[i][j] == 2:
chickens.append((i, j))
#home chicken 위치를 넣는다.
def getCityChickenDistance(chickens): # O(2N * M) N-> 최대 50 M-> 최대 13
cityChickenDistance = 0
for home in homes:
i = home[0]
j = home[1]
min = int(1e9)
for chicken in chickens:
i2 = chicken[0]
j2 = chicken[1]
distance = abs(i - i2) + abs(j - j2)
if min > distance:
min = distance
cityChickenDistance += min
return cityChickenDistance
min = int(1e9)
chickensCandidates = list(combinations(chickens,M))
for candidate in chickensCandidates: # 거의 최대 13C6 개수의 경우의 수가 있다.
# 13*132 정도 니 20 * 200 = 4000 개수
cityChickenDistatnce = getCityChickenDistance(candidate)
if cityChickenDistatnce < min:
min = cityChickenDistatnce
print(min)
# 알고리즘을 작성해보자 !!
# 치킨 거리를 구하는 알고리즘을 작성한다 # 집의 개수 100 치킨 집 개수 13
# -> 1300
# M을 보고 폐업 할 갯수를 판단하고 # 폐업 갯수 13
# 그 갯수대로 제거해보며 치킨 거리를 구해본다 13C6
# 13*132
# 제일 치킨 거리가 제일 작은 것을 취한다.
이제 코테 문제 푸는 전략이 잡힌 것 같다.
푼 방법은 밑에 주석과 같다.
여기서 어떤 치킨매점을 선택할 것인지를 골라야 했는데 combinations를 사용해서 해결하였다.
이코테 정답지를 확인했는데 오 나랑 풀이가 똑같다 👍 좋다좋다
이코테 p335입니다.
# 오... 푸는 거 포기함..
# 답지는 이해했으니 나중에 잊어버릴때에쯤 도전해보겠습니다