문제번호

  • 알고리즘 :
  • 난이도 :

문제

https://www.acmicpc.net/problem/16401

접근

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

가정

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

풀어보기

import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.util.Arrays;  
import java.util.StringTokenizer;  
  
public class Main {  
  
    public static int man;  
    public static int snackCount;  
    public static int[] snackList;  
    public static int size = 0;  
  
    public static void main(String[] args) throws Exception {  
  
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
       StringTokenizer st = new StringTokenizer(br.readLine());  
  
       man = Integer.parseInt(st.nextToken());  
       snackCount = Integer.parseInt(st.nextToken());  
  
       snackList = new int[snackCount];  
  
       st = new StringTokenizer(br.readLine());  
  
       for (int i = 0; i < snackList.length; i++) {  
          snackList[i] = Integer.parseInt(st.nextToken());  
       }  
  
       Arrays.sort(snackList);  
  
       // 이진 탐색을 위한 초기값 설정  
       long left = 1; // 최소 길이는 1       long right = snackList[snackCount - 1]; // 최대 길이는 가장 긴 과자 길이  
       long maxLength = 0; // 최대 길이 초기화  
  
       // 이진 탐색  
       while (left <= right) {  
          long mid = (left + right) / 2;  
          int count = 0;  
  
          // 현재 mid 길이로 나눌 수 있는 친구 수 계산  
          for (int snack : snackList) {  
             count += snack / mid; // 각 과자에서 mid 길이로 나눌 수 있는 개수 추가  
          }  
  
          if (count >= man) { // 나눌 수 있는 친구 수가 충분하면  
             maxLength = mid; // 최대 길이 갱신  
             left = mid + 1; // 길이를 늘려본다  
          } else {  
             right = mid - 1; // 길이를 줄인다  
          }  
       }  
  
       System.out.println(maxLength); // 결과 출력  
  
  
    }  
  
  
  
}

시행착오

참고자료

  • 함께 보면 좋은 글, 링크 등.### 문제번호

  • 알고리즘 :

  • 난이도 :

문제

접근

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

가정

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

풀어보기

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Arrays;  
import java.util.StringTokenizer;  
  
public class Main {  
  
    public static int[] liquids;  
    public static void main(String[] args) throws IOException {  
  
  
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
       int number = Integer.parseInt(br.readLine());  
  
       StringTokenizer st = new StringTokenizer(br.readLine());  
  
       liquids = new int[number];  
  
       for(int i =0 ; i<number ; i++){  
          liquids[i] = Integer.parseInt(st.nextToken());  
       }  
  
       Arrays.sort(liquids); // 용액 배열을 정렬  
  
       int[] result = new int[3]; // 결과를 저장할 배열 (세 개의 용액)  
       long minDiff = Long.MAX_VALUE; // 최소 합 차이를 저장할 변수 초기화  
  
       // 첫 번째 용액을 고정하고 두 번째, 세 번째 용액을 찾기 위한 반복문  
       for (int i = 0; i < number - 2; i++) {  
          int left = i + 1; // 두 번째 용액의 인덱스 시작  
          int right = number - 1; // 세 번째 용액의 인덱스 시작  
  
          // 두 번째와 세 번째 용액의 인덱스를 조정하는 반복문  
          while (left < right) {  
             // 현재 선택된 세 용액의 합 계산  
             long sum = (long) liquids[i] + liquids[left] + liquids[right];  
  
             // 현재 합의 절대값이 최소 차이보다 작으면 업데이트  
             if (Math.abs(sum) < minDiff) {  
                minDiff = Math.abs(sum); // 최소 차이 갱신  
                result[0] = liquids[i]; // 첫 번째 용액 저장  
                result[1] = liquids[left]; // 두 번째 용액 저장  
                result[2] = liquids[right]; // 세 번째 용액 저장  
             }  
  
             // 합이 0보다 작으면 더 큰 값을 찾기 위해 left 인덱스 증가  
             if (sum < 0) {  
                left++;  
             } else { // 합이 0보다 크면 더 작은 값을 찾기 위해 right 인덱스 감소  
                right--;  
             }  
          }  
       }  
  
       Arrays.sort(result); // 결과 배열을 오름차순으로 정렬  
       System.out.println(result[0] + " " + result[1] + " " + result[2]); // 결과 출력  
    }  
}
 

시행착오

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

참고자료

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