코딩테스트/BOJ

[BOJ] 1654 랜선자르기 - JAVA

5월._. 2022. 3. 20.
728x90

1. 문제

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.

이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.)

편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.


2. 풀이

  • 입력받은 K개의 랜선 길이를 정렬한다. (매개변수를 이용한 이분탐색이기 때문에 이 문제는 꼭 정렬이 필요한 건 아니다. 최댓값만 알면 된다.)
  • left=1, right=최댓값으로 설정한다.
  • left는 최소 랜선 길이, right는 최대 랜선 길이다. left<=right일때 반복하면서 이분탐색한다.
    • half 길이로 랜선을 자를 것이다. half는 left와 right의 중간값이다.
    • count는 half길이로 랜선을 몇개나 만들 수 있는 지 저장하는 변수다.
    • 만약 count가 N보다 작다면 더 작게 잘라야하므로 right값을 half-1로 조정한다.
    • 그 외의 경우는 더 크게 잘라도 되는 경우이므로 left값을 half+1로 조정한다.
  • 마지막으로 right를 출력한다. 만들 수 있는 최대 랜선의 길이를 구하기 때문이다.
public static void main(String[] args) throws IOException {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   StringTokenizer st = new StringTokenizer(in.readLine());

   int K = Integer.parseInt(st.nextToken());
   int N = Integer.parseInt(st.nextToken());

   int[] lines = new int[K];
   for (int i = 0; i < K; i++) lines[i] = Integer.parseInt(in.readLine());

   Arrays.sort(lines);

   long right = lines[K-1];
   long left = 1;
   long count, half;

   while(left<=right) {
      count = 0;
      half=(left+right)/2;

      for(int i=0;i<K;i++) count += lines[i]/half;

      if(count<N) right = half-1;
      else left = half+1;
   }

   System.out.println(right);
}

3. 결과

매개변수를 이용한 이분탐색 문제를 처음 풀어봐서 조금 헤맸다. (이 문제가 나무자르기보다 더 일찍 푼 문제다.) 

"찾으려고 하는 값", "최소값", "최대값" 에 집중하면 접근이 깔끔해지는 것 같다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 11727 2xn타일링 2 - JAVA  (0) 2022.03.22
[BOJ] 2304 창고다각형 - JAVA  (0) 2022.03.21
[BOJ] 2805 나무자르기 - JAVA  (0) 2022.03.20
[BOJ] 2193 이친수 - JAVA  (0) 2022.03.19
[BOJ] 11726 2xn 타일링 - JAVA  (0) 2022.03.19

댓글