문제번호

  • 알고리즘 :
  • 난이도 :

문제

랜선 자르기

접근

  • 내가 풀기 위해 접근했던 순서

가정

  • 풀기 전에 ~ 식으로 풀면 되겠다. 등.

풀어보기

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  
  
public class Main {  
  
  
    public static void main(String[] args) throws IOException {  
  
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
       StringTokenizer st = new StringTokenizer(br.readLine());  
  
       int n = Integer.parseInt(st.nextToken());  
       int m = Integer.parseInt(st.nextToken());  
  
  
       int[] arr = new int[n];  
  
       long max = 0;  
  
       // 입력과 동시에 해당 랜선의 길이가 최댓값인지를 확인하고 max를 갱신  
       for (int i = 0; i < n; i++) {  
          arr[i] = Integer.parseInt(br.readLine());  
          if(max < arr[i]) {  
             max = arr[i];  
          }  
       }  
  
  
       // 반드시 max에서 +1 값이어야 한다.  
       max++;  
  
       long min = 0;  
       long mid = 0;  
  
       while (min < max) {  
  
          // 범위 내에서 중간 길이를 구한다.  
          mid = (max + min) / 2;  
  
  
          long count = 0;  
  
          // 구해진 중간 길이로 잘라서 총 몇 개가 만들어지는지를 구한다.  
  
          for (int i = 0; i < arr.length; i++) {  
             count += (arr[i] / mid);  
          }  
  
          /*  
           *  [upper bound 형식]  
           *           *  mid길이로 잘랐을 때의 개수가 만들고자 하는 랜선의 개수보다 작다면  
           *  자르고자 하는 길이를 줄이기 위해 최대 길이를 줄인다.  
           *  그 외에는 자르고자 하는 길이를 늘려야 하므로 최소 길이를 늘린다.  
           */          if(count < m) {  
             max = mid;  
          }  
          else {  
             min = mid + 1;  
          }  
  
  
       }  
  
       // UpperBound로 얻어진 값(min)에 -1이 최대 길이가 된다.  
       System.out.println(min - 1);  
  
  
  
    }  
}

시행착오

  • 풀 면서 자신이 했던 시행착오들

참고자료

  • 함께 보면 좋은 글, 링크 등.

문제번호

  • 알고리즘 :
  • 난이도 :

문제

20291

접근

  • 내가 풀기 위해 접근했던 순서

가정

  • 풀기 전에 ~ 식으로 풀면 되겠다. 등.

풀어보기

  • 코드, 손으로 푼 거 등..

시행착오

  • 풀 면서 자신이 했던 시행착오들

참고자료

  • 함께 보면 좋은 글, 링크 등.