코딩테스트 연습 기록

이종길·2022년 1월 24일
0

코딩테스트 연습

목록 보기
56/128

2022.01.24 32일차

백준 16401번 (과자 나눠주기)

문제

명절이 되면, 홍익이 집에는 조카들이 놀러 온다. 떼를 쓰는 조카들을 달래기 위해 홍익이는 막대 과자를 하나씩 나눠준다.

조카들이 과자를 먹는 동안은 떼를 쓰지 않기 때문에, 홍익이는 조카들에게 최대한 긴 과자를 나눠주려고 한다.

그런데 나눠준 과자의 길이가 하나라도 다르면 조카끼리 싸움이 일어난다. 따라서 반드시 모든 조카에게 같은 길이의 막대 과자를 나눠주어야 한다.

M명의 조카가 있고 N개의 과자가 있을 때, 조카 1명에게 줄 수 있는 막대 과자의 최대 길이를 구하라.

단, 막대 과자는 길이와 상관없이 여러 조각으로 나눠질 수 있지만, 과자를 하나로 합칠 수는 없다. 단, 막대 과자의 길이는 양의 정수여야 한다.

나의 풀이

  1. 인원수 만큼 과자를 나눠줄 수 있는지와 최대 길이 조건
  2. 각 배열의 과자 길이 / 기준이 되는 과자를 나눈 몫(카운트) 만큼 인원 충당 가능
  3. 기준을 정하기 위해 이진 탐색을 사용하는 것이 효율적
  4. 카운트 >= 인원 -> 임시 최대 길이는 기준이 된 과자, 가장 짧은 과자 길이를 변경(기준이 된 과자 + 1)
  5. 카운트 < 인원 -> 조건에 충족x, 기준 변경하기 위해 가장 긴 과자를 변경(기준이 된 과자 - 1)
  6. 가장 짧은 과자가 가장 긴 과자보다 작거나 같을 때까지 반복
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int M = scanner.nextInt();
        int N = scanner.nextInt();

        int[] nArr = new int[N];

        for (int i = 0; i < N; i++) {
            nArr[i] = scanner.nextInt();
        }

        Arrays.sort(nArr);

        int minLength = 1;
        int maxLength = nArr[N - 1];
        int medium;
        int result = 0;

        while(minLength <= maxLength) {
            int count = 0;
            medium = (minLength + maxLength) / 2;

            for (int x = 0; x < N; x++) {
                count += nArr[x] / medium;
            }

            if (count >= M) {
                result = medium;
                minLength = medium + 1;
            } else {
                maxLength = medium - 1;
            }

        }

        System.out.println(result);
    }
}

생각하기

  • 이진탐색 관련 문제 연습하기
profile
Go High

0개의 댓글

관련 채용 정보