728x90
문제 보기
이 문제는 완전 탐색 문제이다.
치킨 집의 위치 중에서 M개를 고른 모든 경우의 수를 탐색하면 된다.
알고리즘 순서는 다음과 같다.
1. 치킨 집의 위치를 저장한다.
2. 치킨 집의 위치 중 M개를 고른다. (조합)
3. 치킨 거리를 계산하고 최솟값을 계속해서 업데이트한다.
- (x1, y1)과 (x2, y2) 거리 -> abs(x2 - x1) + abs(y2 - y1)
코드
import itertools, sys, copy
if __name__ == "__main__":
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
# 치킨집 탐색
chicken = []
for i in range(N):
for j in range(N):
if arr[i][j] == 2:
chicken.append([i, j])
arr[i][j] = 0 # 빈 칸으로 수정
# 치킨집 중에 M개 고르기(조합)
result = list(itertools.combinations(chicken, M))
# 탐색
min_distance = sys.maxsize
for i in range(len(result)):
distance = 0
for m in range(N):
for n in range(N):
if arr[m][n] == 1:
temp = sys.maxsize
for j in range(M):
temp = min(temp, abs(m - result[i][j][0]) + abs(n - result[i][j][1]))
distance += temp
min_distance = min(min_distance, distance)
# 출력
print(min_distance)
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 3190 ] 뱀 - Python (8) | 2020.06.07 |
---|---|
[ 백준 18258 ] 큐2 - Python (4) | 2020.06.06 |
[ 백준 14499 ] 주사위 굴리기 - Python (0) | 2020.06.04 |
[ 백준 14503 ] 로봇 청소기 - Python (2) | 2020.06.02 |
[ 백준 14502 ] 연구소 - Python (0) | 2020.06.01 |