danuri
오늘의 기록
danuri
전체 방문자
오늘
어제
  • 오늘의 기록 (307)
    • java (150)
      • java (33)
      • spring (63)
      • jpa (36)
      • querydsl (7)
      • intelliJ (9)
    • kotlin (8)
    • python (24)
      • python (10)
      • data analysis (13)
      • crawling (1)
    • ddd (2)
    • chatgpt (2)
    • algorithm (33)
      • theory (9)
      • problems (23)
    • http (8)
    • git (8)
    • database (5)
    • aws (12)
    • devops (10)
      • docker (6)
      • cicd (4)
    • book (44)
      • clean code (9)
      • 도메인 주도 개발 시작하기 (10)
      • 자바 최적화 (11)
      • 마이크로서비스 패턴 (0)
      • 스프링으로 시작하는 리액티브 프로그래밍 (14)
    • tistory (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • Bitmask
  • docker
  • 마이크로서비스패턴
  • ChatGPT
  • Thymeleaf
  • reactive
  • RDS
  • Database
  • JPA
  • S3
  • 도메인 주도 설계
  • Security
  • 트랜잭션
  • Java
  • mockito
  • Spring
  • AWS
  • Kotlin
  • nuribank
  • 등가속도 운동
  • SWAGGER
  • POSTGIS
  • connection
  • Saving Plans
  • CICD
  • PostgreSQL
  • DDD
  • Jackson
  • gitlab
  • 자바 최적화

최근 댓글

최근 글

hELLO · Designed By 정상우.
danuri

오늘의 기록

algorithm/problems

백준 2110 - 공유기 설치

2021. 1. 26. 01:03

www.acmicpc.net/problem/2110

 

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)가 한 줄에 하나씩 주어진다.

출력

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

 

풀이

각 집의 좌표가 최대 10억이고, 거리의 최댓값을 구하는 문제기 때문에 이진 탐색을 통한 파라메트릭 서치 문제라고 생각할 수 있다.

구하고자 하는 거리의 최댓값을 구하기 위해 거리 값이 될 수 있는 범위를 먼저 구한다.

최소간격을 1(start), 최대간격을 data의 끝과 끝의 차이(end)로 했을 때 gap에 대해 이진 탐색을 수행한다.

  1. 먼저 기준이 되는 value를 data[0]으로 잡고 mid(gap) 간격마다 공유기를 설치한다.
  2. 설치한 공유기 수가 c보다 크거나 같으면 mid(gap)을 더 늘려본다. 이 때, 최적의 mid를 미리 result에 저장해 둔다.
  3. 설치한 공유기 수가 c보다 작으면 mid(gap)을 더 줄인다.
# 집의 개수(N)와 공유기의 개수(C)를 입력 받기
n, c = list(map(int, input().split(' ')))

# 전체 집의 좌표 정보를 입력 받기
array = []
for _ in range(n):
     array.append(int(input()))
array.sort() # 이진 탐색 수행을 위해 정렬 수행

start = 1 # 가능한 최소 거리(min gap)
end = array[-1] - array[0] # 가능한 최대 거리(max gap)
result = 0

while(start <= end):
    mid = (start + end) // 2 # mid는 가장 인접한 두 공유기 사이의 거리(gap)을 의미
    # 첫째 집에는 무조건 공유기를 설치한다고 가정
    value = array[0]
    count = 1
    # 현재의 mid 값을 이용해 공유기를 설치하기
    for i in range(1, n): # 앞에서부터 차근차근 설치 
        if array[i] >= value + mid:
            value = array[i]
            count += 1
    if count >= c: # C개 이상의 공유기를 설치할 수 있는 경우, 거리를 증가시키기
        start = mid + 1
        result = mid # 최적의 결과를 저장
    else: # C개 이상의 공유기를 설치할 수 없는 경우, 거리를 감소시키기
        end = mid - 1

print(result)

'algorithm > problems' 카테고리의 다른 글

금광  (0) 2021.02.04
프로그래머스 - 가사 검색  (0) 2021.01.27
백준 1715 - 카드 정렬하기  (0) 2021.01.21
백준 18310 - 안테나  (0) 2021.01.21
프로그래머스 - 블록 이동하기  (0) 2021.01.19
    'algorithm/problems' 카테고리의 다른 글
    • 금광
    • 프로그래머스 - 가사 검색
    • 백준 1715 - 카드 정렬하기
    • 백준 18310 - 안테나
    danuri
    danuri
    IT 관련 정보(컴퓨터 지식, 개발)를 꾸준히 기록하는 블로그입니다.

    티스토리툴바