C# 1654번 랜선 자르기
2022. 2. 24. 15:30ㆍ코딩테스트 문제 풀이/[백준]이분 탐색
728x90
반응형
코드 :
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 길이까지 경우의 수를 찾아본다음 문제가 원하는 랜선의 갯수가 나올때까지 찾는 문제이다.
728x90
반응형
'코딩테스트 문제 풀이 > [백준]이분 탐색' 카테고리의 다른 글
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 |