JAVA/알고리즘 문제풀이

[JAVA] boj 14627 파닭파닭

JINGMONG 2021. 12. 26. 23:13

문제 링크 : https://www.acmicpc.net/problem/14627

 

14627번: 파닭파닭

첫째 줄에 승균이가 시장에서 사 온 파의 개수 S(1≤S≤1,000,000), 그리고 주문받은 파닭의 수 C(1≤C≤1,000,000)가 입력된다. 파의 개수는 항상 파닭의 수를 넘지 않는다. (S≤C) 그 후, S 줄에 걸쳐 파

www.acmicpc.net

문제

평소 요리에 관심이 많은 승균이는 치킨집을 개업하였다. 승균이네 치킨집은 파닭이 주메뉴다. 승균이는 가게를 오픈하기 전에 남부시장에 들러서 길이가 일정하지 않은 파를 여러 개 구매하였다. 승균이는 파닭의 일정한 맛을 유지하기 위해 각각의 파닭에 같은 양의 파를 넣는다. 또 파닭 맛은 파의 양에 따라 좌우된다고 생각하기 때문에 될 수 있는 한 파의 양을 최대한 많이 넣으려고 한다. (하지만 하나의 파닭에는 하나 이상의 파가 들어가면 안 된다.) 힘든 하루를 마치고 승균이는 파닭을 만들고 남은 파를 라면에 넣어 먹으려고 한다. 이때 라면에 넣을 파의 양을 구하는 프로그램을 작성하시오. 승균이네 치킨집 자는 정수만 표현되기 때문에 정수의 크기로만 자를 수 있다.

입력

첫째 줄에 승균이가 시장에서 사 온 파의 개수 S(1≤S≤1,000,000), 그리고 주문받은 파닭의 수 C(1≤C≤1,000,000)가 입력된다. 파의 개수는 항상 파닭의 수를 넘지 않는다. (S≤C) 그 후, S 줄에 걸쳐 파의 길이 L(1≤L≤1,000,000,000)이 정수로 입력된다.

출력

승균이가 라면에 넣을 파의 양을 출력한다.

예제 입력 1

3 5
440
350
230

예제 출력 1

145

힌트

파닭 하나당 넣을 수 있는 최대 파의 길이는 175cm으로, 440cm 파에서 2개, 350cm 파에서 2개, 230cm 파에서 1개, 총 5개의 파닭을 만들 수 있고, 각각의 파에서 90cm + 0cm + 55cm = 145cm의 파가 남는다.

문제 풀이

이분 탐색을 이용하여 문제를 해결하였다.

시작을 1, 끝을 가장 긴 파의 길이인 1,000,000,000로 설정하고 반씩 잘라주면서 최적의 파의 길이를 찾아주었다.

사온 파의 모든 길이를 더한 값에서 최적의 파의 길이 * 주문받은 파닭의 개수를 빼준 값을 출력하였다. 

코드

import java.io.*;
import java.util.*;

public class Main_BJ_14627_파닭파닭 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    int S, C;

    S = Integer.parseInt(st.nextToken());
    C = Integer.parseInt(st.nextToken());

    int start = 1;
    int end = 1_000_000_000;
    long sum = 0;

    int[] fa = new int[S];

    for (int i = 0; i < S; i++) {
      fa[i] = Integer.parseInt(br.readLine());
      sum += fa[i];
    }

    while (start <= end) {
      int mid = (start + end) / 2;

      int cnt = 0;
      for (int i = 0; i < S; i++) {
        cnt += fa[i] / mid;
      }

      if (cnt >= C)
        start = mid + 1;
      else
        end = mid - 1;
    }

    System.out.println(sum - end * (long) C);

  }
}

'JAVA > 알고리즘 문제풀이' 카테고리의 다른 글

[JAVA] boj 18352 특정 거리의 도시 찾기  (0) 2021.12.27
[JAVA] boj 2565 전깃줄  (0) 2021.12.27
[JAVA] boj 1302 베스트셀러  (0) 2021.12.26
[JAVA] boj 1339 단어수학  (0) 2021.12.26
[JAVA] boj 13459 구슬탈출  (0) 2021.12.26