[백준] 2110 공유기 설치(Gold.4) - 이진 탐색

2024. 8. 28. 04:44·코딩 테스트/알고리즘

문제

공유기 설치

문제 해설

처음엔 완전 탐색 아이디어를 떠올렸다. 아래 그림과 같이 모든 경우의 수를 구한 뒤 최대 거리를 출력하는 방식이다. 그런데 이 문제는 이분 탐색 문제다... 완전 탐색으로 풀면 시간 초과 뜰 확률이 100%다..


최대한 이분 탐색으로 어떻게 풀지 생각해봤는데 도저히 아이디어가 떠오르지 않아서 이 블로그를 참고해서 풀었다.

  • 공유기의 개수는 최소 2개이고 공유기 사이 거리의 최대 값을 찾아야 한다. 공유기 사이 거리가 최대가 되기 위해서 첫 번째 집은 항상 공유기가 설치되어야 한다.
  • low, high, mid값은 무엇으로 설정해야 할까? 전에 푼 이분 탐색 문제를 떠올려 보자. 대부분 내가 구하고자 하는 값의 최소, 최대, 목표 값으로 잡고 이분 탐색을 진행했다. 그럼 이 문제에서 mid 값은 공유기 사이 거리가 되어야 하고 low와 high는 최소 거리, 최대 거리로 설정한다.
  • 이제 이분 탐색을 진행하자.
    1. 집을 순회하며 현재 집과 다음 집의 거리와 mid값을 비교한다.
      • 현재 집과 다음 집의 거리 >= mid라면 공유기 설치가 가능하므로 카운팅
    2. cnt >= 공유기 개수: 거리를 더 늘려야 하기 때문에 오른쪽을 탐색한다.(`low = mid + 1)
      • 공유기 사이 거리의 최댓값을 구해야 하기 때문에 cnt == 공유기 개수일 때 공유기 사이 거리(mid)를 늘리기 위해 오른쪽을 탐색하는 것이다.
    3. cnt < 공유기 개수: 거리를 줄여야 하기 때문에 왼쪽을 탐색한다.

package BinarySearch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class _2110_공유기_설치 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());

        int[] houses = new int[n];
        for (int i = 0; i < n; i++)
            houses[i] = Integer.parseInt(br.readLine());
        Arrays.sort(houses);

        int low = 1; // 최소 거리
        int high = houses[n-1] - houses[0]; // 최대 거리(첫 집 ~ 마지막 집)
        while (low <= high) {
            int mid = (high + low) / 2;

            int cnt = 1;
            int nowHouse = houses[0];
            for (int i = 1; i < n; i++) {
                if (houses[i] - nowHouse >= mid) {
                    cnt += 1;
                    nowHouse = houses[i];
                }
            }

            // 공유기 개수가 m이면서 가장 가까운 거리가 '최대'이길 원하기 때문에 cnt >= c일 때 오른쪽을 탐색(mid(최소거리)를 더 크게)한다.
            if (cnt >= c) low = mid + 1;
            else high = mid - 1;
        }
        System.out.println(high);
    }
}

'코딩 테스트 > 알고리즘' 카테고리의 다른 글

[백준] 2343 기타 레슨(Silver.1) - 이진 탐색(Binary search)  (0) 2024.08.28
[백준] 2467 용액(Gold.5) - 이진 탐색  (0) 2024.08.28
[백준] 1654 랜선 자르기(Silver.2) - 이진 탐색  (0) 2024.08.28
[백준] 2805 나무 자르기(Silver.2) - 이진 탐색  (0) 2024.08.28
[프로그래머스] 43105 정수 삼각형(Lv.3) - DP(동적 계획법)  (0) 2024.08.23
'코딩 테스트/알고리즘' 카테고리의 다른 글
  • [백준] 2343 기타 레슨(Silver.1) - 이진 탐색(Binary search)
  • [백준] 2467 용액(Gold.5) - 이진 탐색
  • [백준] 1654 랜선 자르기(Silver.2) - 이진 탐색
  • [백준] 2805 나무 자르기(Silver.2) - 이진 탐색
토자맨
토자맨
  • 토자맨
    개발하는 토자맨
    토자맨
  • 전체
    오늘
    어제
    • 개발 공부
      • 코딩 테스트
        • 코드업 기초 100제
        • 백준
        • 99클럽
        • 자료구조
        • 알고리즘
      • Programming Language
        • 자바(JAVA)
      • Back-end
        • Spring
      • Front-end
        • html
        • css
      • DevOps
        • AWS
        • CI CD
        • Docker
        • 홈서버
        • Git
      • Computer Science
        • 자료구조
        • 알고리즘
        • 운영체제
        • OS,Network,DB,DesignPattern
      • 프로젝트
        • 웨이트 쇼핑몰
      • 공부 로드맵
        • 2학년 겨울방학
        • 3학년 2학기
        • 3학년 겨울방학
      • 일상
        • 기타 정보
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    ec2 멈춤 #ec2 터짐 #ec2 ssh 연결 끊김 #ec2 끊김
    백준 #이진탐색 #이분탐색
    백준 #아기상어2 #bfs
    dfs #백준
    dfs #알고리즘
    프로그래머스 #dp
    백준 #dp #동적계획법
    bfs #백준
    오블완
    nvidia-docker #docker cuda #docker gpu #엔비디아 도커
    이진탐색 #이분탐색 #알고리즘
    99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #til
    백준 #bfs
    git filter-branch #commit 수정 #commit
    dp #백준 #동적계획법
    이진탐색 #이분탐색 #백준
    싱글톤 패턴 #싱글톤 컨테이너 #싱글톤 레지스트리 #싱글톤 객체 상태 #무상태 #stateless #유지상태 #staleful
    bfs #최단거리탐색 #프로그래머스
    프로그래머스 #dfs
    bfs #프로그래머스
    백준 #dfs #알고리즘
    백준 #dfs
    solid #객체지향설계원칙
    git filter-repo
    백준 #dfs #11725번
    nvidia container toolkit #
    스프링 #spring #스프링 컨테이너 #스프링 컨텍스트
    티스토리챌린지
    피보나치 수 #백준 #dp
    스프링핵심원리 #김영한 #의존관계자동주입 #의존관계 자동 주입
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
토자맨
[백준] 2110 공유기 설치(Gold.4) - 이진 탐색
상단으로

티스토리툴바