새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 15686 치킨 배달

by 언호 2022. 1. 31.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

치킨집을 기준으로 하여 각 치킨집에서 집까지 치킨 거리를 모두 구하여 2차원 배열로 저장하도록 했습니다.

치킨집을 최대한 M개 모두 사용하는것이 도시의 치킨 거리를 가장 작게 만들 수 있으므로, M개 모두 선택했을때의 조합을 구하였습니다.

미리 구해둔 2차원 배열을 이용해, 각 집과 치킨집의 최소 거리를 찾아서 도시의 치킨거리의 최솟값을 구했습니다.

2) 알고리즘

  • 브루트포스

3) 풀이 코드

사용 언어 - Python

import sys
from itertools import combinations
sys.stdin = open('input.txt')

N, M = map(int, sys.stdin.readline().split())                               # 도시의 크기, 최대 치킨집의 개수
city = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]     # 도시의 정보 / 0-빈칸, 1-집, 2-치킨집

chicken = []        # 치킨집의 좌표들
home = []           # 집의 좌표들
answer = 1e10       # 도시의 치킨 거리, 초기에 임의의 큰 값

for i in range(N):                      # 도시를 한번 확인하여, 치킨집과 집의 좌표들을 모두 구함
    for j in range(N):
        if city[i][j] == 1:
            home.append((i+1, j+1))
        elif city[i][j] == 2:
            chicken.append((i+1, j+1))

dist = [[0] * len(home) for _ in range(len(chicken))]       # 각 치킨집별 집까지의 치킨 거리 / 행-치킨집의 번호, 열-집의 번호

for i in range(len(chicken)):
    for j in range(len(home)):
        dist[i][j] = abs(chicken[i][0] - home[j][0]) + abs(chicken[i][1] - home[j][1])  # i번째 치킨집과 j번째 집의 치킨 거리를 구하여 저장

for comb in combinations(range(len(chicken)), M):       # 조합을 이용하여 치킨집을 M개 선택
    tmp = 0                                             # 현재 경우의 도시의 치킨 거리
    for h in range(len(home)):                          # 모든 집의 치킨 거리를 구해야 함
        min_dist = 1e10
        for c in comb:                                  
            min_dist = min(min_dist, dist[c][h])        # 선택한 치킨 거리와 이전의 치킨 거리 중 최솟값을 저장 
        tmp += min_dist                                 # 도시의 치킨 거리에 현재 집의 치킨 거리 추가

        if tmp >= answer:           # 탐색하던 중 기존에 구해둔 도시의 치킨 거리 보다 큰 값이면, 이후에 찾아도 의미 없으므로 종료
            break
    else:
        answer = tmp                # 도시의 치킨 거리 최솟값 갱신
        
print(answer)                       # 출력

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/15686

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1197 최소 스패닝 트리  (0) 2022.02.02
[프로그래머스] 뉴스 클러스터링  (0) 2022.02.01
[백준] 3190 뱀  (0) 2022.01.30
[백준] 18222 투에-모스 문자열  (0) 2022.01.29
[백준] 1963 소수 경로  (0) 2022.01.28

댓글