일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- C++ 공백 입력
- 백준
- 1463
- C++ 함수
- 백준1463
- AIDEEPDIVE
- 패스트캠퍼스
- AI강의
- 9095
- 혁펜하임AI
- c++ 기초
- cuDNN
- 백준9095
- 백준1026
- 패스트캠퍼스혁펜하임
- C++ 백준
- pytorch
- 혁펜하임강의후기
- for문
- 1로만들기
- 백준C++
- 조건문
- CUDA
- C++
- 혁펜하임강의
- precision
- 비교연산자
- tensorflow
- 혁펜하임
- 반복문
- Today
- Total
코딩하는 덕구 🐶
121. [삼성기출17]Python 백준 15686 번 치킨 배달 자세한 설명 본문
안녕하세요 코딩하는 덕구입니다.
백준 15686 번 치킨 배달 입니다.
https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
먼저 백준 15686 번 치킨 배달 정답 코드입니다. 설명은 아래에 있습니다.
from itertools import combinations
n, m = map(int, input().split())
city = []
houses = []
chickens = []
#도시 정보 입력
for _ in range(n):
city.append(list(map(int, input().split())))
#가정집, 치킨집 좌표 저장
for i in range(n):
for j in range(n):
if city[i][j] == 1:
houses.append([i, j])
elif city[i][j] == 2:
chickens.append([i, j])
ans = 1e9
for chicken in combinations(chickens, m):#모든 경우의 m개의 치킨집 좌표 리스트
tmp = 0
for house in houses: #모든 집의 좌표
distance = 100
for chi in chicken: #해당 경우의 치킨집 좌표 리스트
distance = min((abs(house[0] - chi[0]) + abs(house[1] - chi[1])), distance)
tmp += distance
ans = min(ans, tmp)
print(ans)
문제 접근
1. 치킨집이 m개보다 적어지면 치킨 거리는 같거나 늘어나므로 m개보다 작은 치킨집은 고려하지 않습니다.
2. combinations를 이용해 가능한 모든 m개의 치킨집의 조합을 구합니다.
3. 모든 치킨집, 집을 비교하며 최소거리를 업데이트 합니다.
Python 코드 구현
도시 정보를 입력받고, 치킨집, 가정집의 좌표를 저장합니다.
from itertools import combinations
n, m = map(int, input().split())
city = []
houses = []
chickens = []
#도시 정보 입력
for _ in range(n):
city.append(list(map(int, input().split())))
#가정집, 치킨집 좌표 저장
for i in range(n):
for j in range(n):
if city[i][j] == 1:
houses.append([i, j])
elif city[i][j] == 2:
chickens.append([i, j])
1. m개의 치킨집을 고르는 모든 경우의 수 속에서 가장 치킨 거리가 짧은 값을 ans에 저장합니다. (첫 번째 for 문)
2. 모든 집을 방문하면서, 해당 경우의 m개 치킨집들을 모두 비교하여 가장 거리가 짧은 값들만을 tmp에 더합니다. (두 번째 for문)
3. tmp와 ans 를 비교하며 더 작은 값을 업데이트 합니다.
(tmp 는 지금 경우의 치킨거리, ans는 지금까지의 경우의 가장 짧은 치킨거리 입니다.)
ans = 1e9
for chicken in combinations(chickens, m):#모든 경우의 m개의 치킨집 좌표 리스트
tmp = 0
for house in houses: #모든 집의 좌표
distance = 100
for chi in chicken: #해당 경우의 치킨집 좌표 리스트
distance = min((abs(house[0] - chi[0]) + abs(house[1] - chi[1])), distance)
tmp += distance
ans = min(ans, tmp)
답을 출력합니다.
print(ans)
파이썬 백준 15686 번 치킨 배달 최종 코드입니다.
from itertools import combinations
n, m = map(int, input().split())
city = []
houses = []
chickens = []
#도시 정보 입력
for _ in range(n):
city.append(list(map(int, input().split())))
#가정집, 치킨집 좌표 저장
for i in range(n):
for j in range(n):
if city[i][j] == 1:
houses.append([i, j])
elif city[i][j] == 2:
chickens.append([i, j])
ans = 1e9
for chicken in combinations(chickens, m):#모든 경우의 m개의 치킨집 좌표 리스트
tmp = 0
for house in houses: #모든 집의 좌표
distance = 100
for chi in chicken: #해당 경우의 치킨집 좌표 리스트
distance = min((abs(house[0] - chi[0]) + abs(house[1] - chi[1])), distance)
tmp += distance
ans = min(ans, tmp)
print(ans)
백준 15686 번 치킨 배달 자세한 설명 및 Python 코드였습니다.
감사합니다.
'알고리즘 문제 풀이' 카테고리의 다른 글
123. [삼성기출19]Python 백준 16234 번 인구 이동 자세한 설명 (0) | 2023.06.05 |
---|---|
122. [삼성기출18]Python 백준 5373 번 큐빙 자세한 설명 (0) | 2023.05.31 |
120. [삼성기출16]Python 백준 15685 번 드래곤 커브 자세한 설명 (0) | 2023.05.26 |
119. [삼성기출15]Python 백준 15684 번 사다리조작 자세한 설명 (0) | 2023.05.19 |
118. [삼성기출14]Python 백준 15683 번 감시 자세한 설명 (0) | 2023.05.16 |