이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 2110(공유기 설치) - Python(파이썬) - 이분탐색

  • 2022.06.20 19:02
  • [백준] Python,Java로 풀기📖/최단거리
    반응형
     

    2110번: 공유기 설치

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

    www.acmicpc.net

    예제 설명

    최소 거리는 1 , 최대 거리는 9(arr[-1])-1(arr[0]) = 8 

    1) 최소 거리가 4인 경우(mid) 공유기 설치

    집과 집 사이의 거리
    start     mid
    =(1+8)//2=4
          end
    1 2 3 4 5 6 7 8
    공유기 설치
    1 2 4 8 9

    최소 거리가 4가 되는 경우에는 1부터 시작해서 1+4=5 이상의 좌표에 공유기를 설치해야한다. 그렇기 때문에 1에 설치 후에 5이상의 좌표인 8에 설치를 한다. 그렇게 되면 총 공유기 설치는 2개가 되므로 공유기의 개수 3이랑 맞지 않게 된다. 따라서 최소 거리는 4보다  작아져야한다. 

    => end = mid-1 =3 

     

    2) 최소 거리가 2인 경우(mid) 공유기 설치

    집과 집 사이의 거리
    start mid
    =(1+3)//2=2
    end          
    1 2 3 4 5 6 7 8
    공유기 설치
    1 2 4 8 9

    최소 거리가 2가 되는 경우에는 1에 설치-> 1+2 = 3이상의 좌표인 4에 설치 -> 4+3 = 7 이상의 좌표인 8에 설치 

    그렇게 되면 총 공유기 설치는 3개가 되므로 공유기의 개수 3이랑 동일하다. 공유기 사이의 거리를 가능한 크게 하여 설치하여야 하므로 한번 더 이분탐색으로 실행

    => start = mid+1

     

    3) 최소 거리가 3인 경우(mid) 공유기 설치

    start =3, end=3 => mid = (3+3)//2 = 3

    집과 집 사이의 거리
        start,
    mid,end
             
    1 2 3 4 5 6 7 8
    공유기 설치
    1 2 4 8 9

    최소거리가 3인 되는 경우에는 1에 설치 -> 1+3 =4이상의 좌표인 4에 설치 -> 4+3 = 7이상의 좌표인 7에 설치

    그렇게 되면 총 공유기 설치는 3개가 되므로 공유기의 개수 3이랑 동일하다. 

    => start = 3+1 = 4를 넣으면 end =3보다 크게 되므로 그만둔다.

     

    문제 풀이

    ① 거리의 최솟값 start에 넣기, 거리의 최댓값 end에 넣기 
    ② 이분탐색을 통해 집과 집사이의 거리를 구한다.
    -> 인접한 공유기 사이의 거리의 최솟값을 출력해야하므로 이분탐색을 할 때마다 공유기 사이의 거리의 최솟값을 구한다.
    ③ 공유기 개수가 c와 일치하는 경우에는 두 공유기 사이의 거리를 가능한 크게 하여 설치하라고 하였으므로 max의 값이 나오도록 한다.

    💻Python(파이썬)

    import sys
    n,c = map(int,sys.stdin.readline().split())
    house=[int(sys.stdin.readline()) for _ in range(n)]
    #오름차순 정렬
    house.sort()
    #거리의 최솟값
    start = 1
    #거리의 최댓값(가장 맨 뒤에 값에서 가장 맨 앞에 값 뺴기)
    end = house[-1]-house[0]
    result =0
    while start<=end:
        mid = (start+end)//2#2로 나누어서 소수점 버림
        now = house[0]
        count = 1
        #공유기 사이의 거리 두 간격의 거리
        tmp = end
        for i in range(1,n):
        	#현재 위치 + 거리의 값이상의 좌표에 공유기 설치
            if now + mid<=house[i]:
                tmp = min(tmp,house[i]-now)
                count+=1
                now = house[i]
    
        if count<c:#더 많이 설치 해야한다.-> 간격이 짧아져야함
            end =mid-1
        if count>=c:#설치가 완료되거나 더 많이 설치된 경우 -> 간격이 넓어져야함
            #공유기 사이의 간격은 가능한 크게 하여 설치하여야하므로 간격 비교
            start = mid+1
            result = max(result,tmp)
    
    print(result)

    💻Java(파이썬)

    import java.util.*;
    import java.io.*;
    
    public class Main {
        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[] house = new int[N];
            for(int i=0;i<N;i++){
                house[i]=Integer.parseInt(br.readLine());
            }
            Arrays.sort(house);
            int start = 1;
            int end = house[house.length-1]-house[0];
            int result =0;
            while(start<=end){
                int mid =(start+end)/2;
                int now = house[0];
                int count =1;
                //공유기 사이의 거리 두 간격의 거리
                int tmp = end;
                for(int i=1;i<N;i++){
                    if(now+mid<=house[i]){
                        tmp = Math.min(tmp,house[i]-now);
                        count++;
                        now = house[i];
                    }
                }
                if(count<C){
                    end = mid-1;
                }
                if(count>=C){
                    start = mid+1;
                    result = Math.max(result,tmp);
                }
            }
            System.out.println(result);
        }
    }
    반응형

    '[백준] Python,Java로 풀기📖 > 최단거리' 카테고리의 다른 글

    백준 4485(녹색 옷 입은 애가 젤다지?) - 다익스트라알고리즘, 힙구조, 최단거리- python  (0) 2024.11.04
    백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜  (0) 2022.06.26
    백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘  (0) 2022.06.20
    백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로  (0) 2022.06.12

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 4485(녹색 옷 입은 애가 젤다지?) - 다익스트라알고리즘, 힙구조, 최단거리- python

      백준 4485(녹색 옷 입은 애가 젤다지?) - 다익스트라알고리즘, 힙구조, 최단거리- python

      2024.11.04
    • 백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜

      백준 10159(저울) - Python(파이썬),Java(자바) - 플로이드 워셜

      2022.06.26
    • 백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘

      백준 1140(플로이드) -Python(파이썬) - 플로이드워셜 알고리즘

      2022.06.20
    • 백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로

      백준 1504(특정한 최단 경로) - Python(파이썬) - 최단 경로

      2022.06.12
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 99클럽
    • 프로그래머스
    • 코딩테스트준비
    • 백준
    • 오블완
    • TiL
    • 항해99
    • 티스토리챌린지

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바