[Python] BOJ / 2110번 / 공유기 설치

2022. 4. 11. 15:20·🥇 Problem Solving/Binary Search
 

2110번: 공유기 설치

첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가

www.acmicpc.net

 

문제

도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.

도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.

C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.

입력

첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다.

출력

첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.

풀이

일반적인 탐색 방법을 사용하면 시간초과가 발생하는 문제이다.

 

따라서 이진 탐색 알고리즘을 사용하여 풀이하였다.

 

구현 방식은 다음과 같다.

 

  1. 먼저 집의 좌표를 입력받은 뒤, 이진 탐색을 하기 위해 정렬을 수행한다.
  2. 왼쪽 포인터(min_dist)를 최소 거리로, 오른쪽 포인터(max_dist)를 최대 거리로 초기화한 후, 이진 탐색을 수행한다.
  3. 두 포인터의 합을 2로 나누어 기준이 될 거리(dist)를 구한다.
  4. 3번에서 구한 거리(dist)를 기준으로 배열(x)을 탐색하며 두 집의 사이의 거리(x[i] - prev)가 기준 거리(dist)보다 크거나 같을 경우 설치한 공유기의 개수(cnt)를 증가시킨다.
  5. 4번의 과정이 끝나고 만약 설치한 공유기의 개수(cnt)가 보유하고 있는 공유기의 개수(c)보다 크거나 같을 경우 간격을 더 크게하거 설치할 수 있는 경우가 있을 수 있다는 것이므로 왼쪽 포인터(min_dist) 값을 증가시켜 공유기 사이의 간격을 증가시킨 다음 다시 이분 탐색을 수행한다. 그렇지 않을 경우 오른쪽 포인터(max_dist) 값을 감소시켜 공유기 사이의 간격을 감소시킨 다음 이분 탐색을 수행한다.
  6. 출력값(ans)은 설치한 공유기의 개수(cnt)가 조건을 충족했을 때마다 갱신시켜준다.

import sys
input = sys.stdin.readline

def solve():
    ans = 0
    min_dist, max_dist = 1, x[-1] - x[0]

    while min_dist <= max_dist:
        dist = (min_dist + max_dist) // 2
        prev = x[0]
        cnt = 1

        for i in range(1, n):
            if x[i] - prev >= dist:
                cnt += 1
                prev = x[i]

        if cnt >= c:
            min_dist = dist + 1
            ans = dist
        else:
            max_dist = dist - 1

    return ans

n, c = map(int, input().split())
x = []
for _ in range(n):
    x.append(int(input()))

x.sort()
print(solve())
저작자표시 (새창열림)

'🥇 Problem Solving > Binary Search' 카테고리의 다른 글

[Python] BOJ / 2470번 / 두 용액  (0) 2022.05.07
[Python] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2  (0) 2022.04.24
[C++] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2  (0) 2022.03.22
[C++] BOJ / 2110번 / 공유기 설치  (0) 2022.03.11
[C++] BOJ / 1654번 / 랜선 자르기  (0) 2021.12.13
'🥇 Problem Solving/Binary Search' 카테고리의 다른 글
  • [Python] BOJ / 2470번 / 두 용액
  • [Python] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2
  • [C++] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2
  • [C++] BOJ / 2110번 / 공유기 설치
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 2110번 / 공유기 설치
상단으로

티스토리툴바