Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- gemmasprint
- directx 그래픽스
- c++ 1991
- constant buffre
- pcce 기출문제 풀이
- c++ 5567
- 프로그래밍공부
- render target
- 렌더링 파이프
- pccp 기출문제 풀이
- orthographic projection
- 잔디 기부 캠페인
- DirectX
- pcce 기출문제 10번 공원
- pcce 기출문제 9번 지폐 접기
- root signature
- boj 5567
- pcce 기출문제 10번 지폐 접기 풀이
- tessellation
- 백준 5567
- pcce 기출문제 10번 공원 풀이
- boj 1991
- depth-stencil
- 데이터 체커
- 오블완
- 잔디 기부
- PCCE
- boj 22942
- texture mapping
- DirectX12
Archives
- Today
- Total
오구의코딩모험
[Python] 15686번 : 치킨 배달 본문
반응형
문제 3줄 요약
1. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다.
2. 두 칸 (r1, c1)과 (r2, c2) 사이의 거리는 |r1-r2| + |c1-c2|
3. 치킨집을 최대 M개 골라 도시의 치킨 거리의 합이 가장 작을 때의 값을 구하라!
문제 풀다가 보니
치킨이 먹고싶다는 생각이 들기도 했다.
주변에 치킨 집이 참 많은데,
어쩌면 이 문제는 한 번쯤 생각해봤던 문제인 것 같다 ㅋㅋ
아무튼
문제로 돌아가서!
전에 풀었던 연구소 문제에서 벽을 미리 세워두듯이,
이번 문제에서도 최대 M개인 치킨집을 미리 골라두고
도시의 치킨 거리의 합을 작은 값으로 갱신해주는 방법을 생각하였다.
최대 M개의 치킨집은
combination을 이용하여 경우의 수를 모두 고려해주었다.
from sys import stdin
from itertools import combinations
# 좌표 구조체
class XY:
def __init__(self, x, y):
self.x = x
self.y = y
# 도시의 치킨 거리 계산
def cal_distance(copy_map,bf_list):
length = len(copy_map)
chicken_road = 0
for x in range(length):
for y in range(length):
short_d = 0
if copy_map[x][y] == 1:
for bf in bf_list:
dis = abs(bf.x - x) + abs(bf.y - y)
if short_d == 0:
short_d = dis
else:
short_d = short_d if short_d <= dis else dis
chicken_road += short_d
return chicken_road
if __name__ == "__main__":
# N * N의 도시, 최대 M개의 치킨집
N, M = map(int, stdin.readline().split())
chicken_map = []
chicken_list = []
visited = []
min_length = 0
# 도시 지도 정보 및 치킨집 위치 삽입
for x in range(N):
map_info = []
for y,num in enumerate(map(int, stdin.readline().split())):
if num == 2:
chicken_list.append(XY(x,y))
map_info.append(0)
else:
map_info.append(num)
visited.append(0)
chicken_map.append(map_info)
# COMBINATION을 통한 모든 치킨집 경우의 수, 브루트포스 알고리즘
for bf_list in list(combinations(chicken_list,M)):
copy_map = chicken_map.copy()
for bf in bf_list:
copy_map[bf.x][bf.y] = 2
if min_length == 0:
min_length = cal_distance(copy_map, bf_list)
else:
cal_d = cal_distance(copy_map, bf_list)
min_length = cal_d if min_length > cal_d else min_length
print(min_length)
실생활에서 한 번쯤 생각해봤던 고민을
코딩으로 풀어나갔다는게 재밌던 문제였다.
연구소 문제를 접하고 푸니
크게 어려움이 없었다.
끝!
반응형
'프로그래밍 공부 > 백준 알고리즘' 카테고리의 다른 글
[Python] 5430번 : AC (1) | 2023.02.16 |
---|---|
[Python] 7576번 : 토마토 (0) | 2023.02.16 |
[Python] 14503번 : 로봇 청소기 (0) | 2023.02.16 |
[Python] 14502번 : 연구소 (0) | 2023.02.15 |
[Python] 1351번 : 무한 수열 (0) | 2023.02.14 |
Comments