[파이썬/python] 백준 28215 - 대피소

2024. 9. 7. 19:56·알고리즘
반응형

문제

https://www.acmicpc.net/problem/28215


문제 설명

  1. KOI 마을에는 N개의 집이 존재하며 N개의 마을 중 K개의 대피소를 뽑는다.
  2. 각각의 집과 대피소와의 거리를 계산한다나머지 집들 중 대피소와 가장 거리가 먼 집과 대피소와의 거리가 최소가 되도록 대피소를 선택한다.

두 좌표 사이의 거리 계산식: $|X_2 - X_1 | + |Y_2 - Y_1 |$

 

$N=5$일 때 $(1,5)$, $(3,0)$, $(3,3)$, $(6,12)$, $(8,9)$위치에 집이 존재한다고 가정하자.

1. 대피소의 위치가 $(3,0)$, $(1,5)$일 때

  $(3,0)$ $(1,5)$ 최솟 값
$(3,3)$ $3$ $4$ $3$
$(6,12)$ $15$ $12$ $12$
$(8,9)$ $14$ $11$ $11$

각 집에서 대피소와의 거리의 최소는 3,12,11 이므로 대피소와 가장 먼 집의 거리는 12이다.

2. 대피소의 위치가 $(3,3)$, $(6,12)$일 때

  $(3,0)$ $(1,5)$ 최솟 값
$(1,5)$ $4$ $12$ $4$
$(3,0)$ $3$ $15$ $3$
$(8,9)$ $11$ $5$ $5$

각 집에서 대피소와의 거리의 최소는 4,3,5 이므로 대피소와 가장 먼 집의 거리는 5이다.

 


풀이

브루트포스 알고리즘을 통해 대피소가 선택될 수 있는 모든 경우의 수를 확인한다.

  1. N개의 집들 중 K개의 대피소를 선택한다.(조합)
  2. 각각의 집과 대피소와의 거리를 계산한 후 집 별 대피소와의 거리 최솟값을 갱신한다.
  3. 집 별 거리 최솟값 중 가장 먼 집의 거리를 찾는다.
  4. 가장 먼 집의 거리의 최솟값을 갱신한다.

코드

import sys
import math
from itertools import combinations
input = sys.stdin.readline

N,K = map(int,input().split())
house = []
INF = math.inf
for i in range(N):
    x,y = map(int,input().split())
    house.append([x,y])

def cal_dist(cur_house, shelter):
    return abs(house[cur_house][0]-house[shelter][0]) + abs(house[cur_house][1]-house[shelter][1])



max_dist = INF

for shelters in list(combinations(range(N),K)): # 대피소 K개를 선택
    cur_dist = -1

 # 집 별 대피소와의 거리를 계산한다.
    for cur_house in range(N):
        cur_house_dist = INF
        for shelter in shelters:
            cur_house_dist = min(cur_house_dist, cal_dist(cur_house, shelter))
        cur_dist = max(cur_dist, cur_house_dist)
    max_dist = min(max_dist, cur_dist)
print(max_dist)

시간복잡도

  • 시간 제한: 3초, 약 $O(3*10^8)$
  • N개의 집 중 K개를 선택하는 시간복잡도: $O(_nC_k)$
  • 집 별 대피소와의 거리 계산 시간복잡도: $O((N-K)*K)$
  • 총 시간복잡도: 약 $O(_nC_k * N*(N-K))$
  • 최악일 때 시간복잡도: $N=50$, $K=3$일 경우 $O(_{50}C_3 * 50 * 47) = 4*10^7$
반응형

'알고리즘' 카테고리의 다른 글

[파이썬/python] 백준 17129 - 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유  (0) 2024.09.07
[파이썬/python] 백준 11578 - 팀원 모집  (0) 2024.09.07
[파이썬/python] 백준 16493 - 최대 페이지 수  (0) 2024.09.07
[파이썬/python] 백준 14646 - 욱제는 결정장애야!!  (3) 2024.09.07
[파이썬/python] 백준 1816 - 암호키  (0) 2024.09.07
'알고리즘' 카테고리의 다른 글
  • [파이썬/python] 백준 11578 - 팀원 모집
  • [파이썬/python] 백준 16493 - 최대 페이지 수
  • [파이썬/python] 백준 14646 - 욱제는 결정장애야!!
  • [파이썬/python] 백준 1816 - 암호키
개골개굴
개골개굴
굶고 코딩하기
  • 개골개굴
    밥스토리
    개골개굴
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (144)
      • 알고리즘 (124)
      • Java (2)
      • 자기개발 (18)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Redis
    python
    컴퓨터구조
    SMTP
    컴퓨터 구조
    OS
    java
    백준
    인프런
    async
    completablefuture
    파이썬
    알고리즘
    springboot
    작심삼일 챌린지
  • 최근 댓글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
개골개굴
[파이썬/python] 백준 28215 - 대피소
상단으로

티스토리툴바