C# 1654번 랜선 자르기

2022. 2. 24. 15:30C#/[백준]이분 탐색

문제

코드 :

using System;

namespace _3
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] K_N = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            //K
            long K = K_N[0];
            //N
            long N = K_N[1];
            //랜선의 전체길이
            long lengthSum = 0;
            //랜선배열
            long[] lengthArr = new long[K];
            //랜선 전처리
            for (int i = 0; i < K; i++)
            {
                long length = long.Parse(Console.ReadLine());
                lengthArr[i] = length;
                lengthSum += length;
            }

            //start, mid, end
            long start = 1;
            long end = lengthSum / N;
            long mid = (start + end) / 2;

            while (start<= end)
            {
                long count = 0;
                
                //mid로 각 랜선을 짜르고 만들 수 있는 랜선의 갯수를 구하자
                for (int i = 0; i < K; i++)
                {
                    count += lengthArr[i] / mid;
                }
                //원하는 값보다 랜선이 더 많이 만들어지면
                //더 큰수로 나눠야한다는 의미이므로
                //start = mid
                if (count >= N)
                {
                    start = mid+1;
                    mid = (start + end) / 2;
                }
                //end = mid
                else if (count < N)
                {
                    end = mid-1;
                    mid = (start + end) / 2;
                }
            }
            //start == mid 일때 while문 빠져나가니 end가 혹시 답일경우는 체크하지를 못한다
            //그래서 end가 답일 경우도 혹시 모르니 한번 체크해준다.
            
                Console.WriteLine(mid);
        }
    }
}

이분탐색을 언제 활용할 수 있는지를 생각해봤다. 내가 생각하고자 하는 범위내의 값들을 하나씩 확인해보면서 이게 맞는지 안맞는지 찾는 문제일 경우 이분탐색을 사용하기 좋다고 생각한다. 예를 들어 이 문제의 경우 랜선의 길이를 1부터 MAX 길이까지 경우의 수를 찾아본다음 문제가 원하는 랜선의 갯수가 나올때까지 찾는 문제이다.

'C# > [백준]이분 탐색' 카테고리의 다른 글

C# 2110번 공유기 설치  (0) 2022.02.24
C# 2805번 나무 자르기  (0) 2022.02.24
C# 10816번 숫자 카드2  (0) 2022.02.24
C# 1920번 수 찾기  (0) 2022.02.24