[백준] 14627 - 파닭파닭
1. 문제
2. 개요
길이가 일정하지 않은 파들을 이용해 같은 양의 파를 최대한 많이 넣어 일정 개수의 파닭을 만든다.
이렇게 파닭을 다 만든 후 남은 파의 길이를 구하는 문제.
3. 풀이 및 코드
3-1. 풀이
이분탐색을 이용한다.
1을 시작점 s, 가장 긴 파의 길이를 끝 점 e로 잡고 시작한다.
중간점인 m을 파닭에 넣을 파로 설정한다.
각 파의 길이를 m으로 나눈 값이 각 파로 만들 수 있는 파닭의 개수가 된다.
그러므로 이를 이용해 이분탐색을 진행하면 된다.
각 파의 길이를 m으로 나눈 값을 모두 더한 값이 파닭의 개수보다 크거나 같다면 파를 더 길게 자를 수 있으므로 m을 저장해두고 시작점 s를 m+1로 갱신한다.
그렇지 않다면 파닭의 개수를 맞출 수 없다는 얘기이므로 끝 점 e 를 m-1로 갱신한다.
반복문을 탈출했다면 전체 파의 길이 - 넣을 파의 길이 * 파닭의 개수를 답으로 출력한다.
3-2. Python
import sys
N, M = map(int, sys.stdin.readline().split())
gos = []
s, e = 1, 1
maxlength = 0
total = 0
answer = 0
for i in range(N):
gos.append(int(sys.stdin.readline()))
total += gos[i]
if gos[i] > e:
e = gos[i]
while s <= e:
m = (s + e) // 2
tmp = sum([g // m for g in gos])
if tmp >= M:
s = m + 1
maxlenth = m
elif tmp < M:
e = m - 1
answer = total - maxlenth * M
print(answer)
3-3. C#
namespace boj_14627
{
internal class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
string[] input = sr.ReadLine().Split();
int N = int.Parse(input[0]);
int M = int.Parse(input[1]);
long s = 1;
long e = 1;
long maxlength = 0;
long total = 0;
long answer = 0;
List<int> gos = new List<int>();
for (int i = 0; i < N; i++)
{
gos.Add(int.Parse(sr.ReadLine()));
total += gos[i];
if (gos[i] > e)
e = gos[i];
}
while (s <= e)
{
long m = (s + e) / 2;
long tmp = 0;
foreach (int g in gos)
tmp += g / m;
if (tmp >= M)
{
s = m + 1;
maxlength = m;
}
else
e = m - 1;
}
answer = total - maxlength * M;
sw.WriteLine(answer);
sw.Close();
}
}
}
Comments