Contents

μž…κ΅­μ‹¬μ‚¬ (with.Java)

   Oct 23, 2024     3 min read

μž…κ΅­μ‹¬μ‚¬ (with.Java) 에 λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ νšŒκ³ μ™€ λ‹€λ₯Έ 풀이 방법을 μ•Œμ•„λ³΄λ©°, μ•Œμ•„κ°€κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

nλͺ…이 μž…κ΅­μ‹¬μ‚¬λ₯Ό μœ„ν•΄ 쀄을 μ„œμ„œ 기닀리고 μžˆμŠ΅λ‹ˆλ‹€.

각 μž…κ΅­μ‹¬μ‚¬λŒ€μ— μžˆλŠ” μ‹¬μ‚¬κ΄€λ§ˆλ‹€ μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ‹€λ¦…λ‹ˆλ‹€.

μ²˜μŒμ— λͺ¨λ“  μ‹¬μ‚¬λŒ€λŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.

ν•œ μ‹¬μ‚¬λŒ€μ—μ„œλŠ” λ™μ‹œμ— ν•œ λͺ…λ§Œ 심사λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μ•žμ— μ„œ μžˆλŠ” μ‚¬λžŒμ€ λΉ„μ–΄ μžˆλŠ” μ‹¬μ‚¬λŒ€λ‘œ κ°€μ„œ 심사λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ 더 빨리 λλ‚˜λŠ” μ‹¬μ‚¬λŒ€κ°€ 있으면 κΈ°λ‹€λ Έλ‹€κ°€ 그곳으둜 κ°€μ„œ 심사λ₯Ό 받을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ΅œμ†Œλ‘œ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μž…κ΅­μ‹¬μ‚¬λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‚¬λžŒ 수 n, 각 심사관이 ν•œ λͺ…을 μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ λ‹΄κΈ΄ λ°°μ—΄ timesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ˜ μ΅œμ†Ÿκ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • μž…κ΅­μ‹¬μ‚¬λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‚¬λžŒμ€ 1λͺ… 이상 1,000,000,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 심사관이 ν•œ λͺ…을 μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 1λΆ„ 이상 1,000,000,000λΆ„ μ΄ν•˜μž…λ‹ˆλ‹€.
  • 심사관은 1λͺ… 이상 100,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

ntimesreturn
6[7,10]28

문제 풀이

import java.util.Arrays;

class Solution {
    public long solution(int n, int[] times) {
        long answer = 0;
        Arrays.sort(times);
        long left = 0;
        long right = times[times.length - 1] * (long)n;

        while(left <= right){
            long mid = (left + right) / 2;
            long test_num = 0;
            for(int i = 0; i < times.length; i++){
                test_num += mid / times[i];
            }
            if(test_num < n){
                left = mid + 1;
            }else{
                answer = mid;
                right = mid - 1;
            }
        }
        return answer;
    }
}

풀이 μ„€λͺ…

주어진 심사관듀이 주어진 μ‹œκ°„ 내에 nλͺ…μ˜ μ‚¬λžŒμ„ 심사할 수 μžˆλŠ” μ΅œμ†Œ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ 이진 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ¨Όμ €, 주어진 심사 μ‹œκ°„ 배열인 timesλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.

μ΄λŠ” μ΅œμ†Œ μ‹œκ°„κ³Ό μ΅œλŒ€ μ‹œκ°„μ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ‹¨κ³„μž…λ‹ˆλ‹€.

이후 left λ³€μˆ˜λŠ” 0으둜, right λ³€μˆ˜λŠ” κ°€μž₯ 였래 κ±Έλ¦¬λŠ” μ‹¬μ‚¬κ΄€μ˜ μ‹œκ°„(times λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μš”μ†Œ)κ³Ό n을 κ³±ν•œ κ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

μ΄λŠ” 심사 μ‹œκ°„μ΄ μ΅œλŒ€λ‘œ 걸릴 경우λ₯Ό κ°€μ •ν•œ κ²ƒμž…λ‹ˆλ‹€.

이진 탐색을 μˆ˜ν–‰ν•˜λ©΄μ„œ, mid 값을 left와 right의 μ€‘κ°„κ°’μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.

midλŠ” ν˜„μž¬μ˜ 평균 μ‹œκ°„μœΌλ‘œ κ°„μ£Όλ˜λ©°, 각 심사관이 이 μ‹œκ°„ 내에 λͺ‡ λͺ…을 심사할 수 μžˆλŠ”μ§€λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

이λ₯Ό μœ„ν•΄ test_num λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬, λͺ¨λ“  심사관듀이 mid μ‹œκ°„ λ™μ•ˆ 심사할 수 μžˆλŠ” 총 인원 수λ₯Ό κ΅¬ν•©λ‹ˆλ‹€.

test_num 값은 midλ₯Ό 각 μ‹¬μ‚¬κ΄€μ˜ 심사 μ‹œκ°„μœΌλ‘œ λ‚˜λˆˆ 값을 λͺ¨λ‘ λ”ν•˜μ—¬ κ³„μ‚°ν•©λ‹ˆλ‹€.

이후, test_num이 n보닀 μž‘λ‹€λ©΄, μ΄λŠ” ν˜„μž¬ μ‹œκ°„(mid) 내에 λͺ¨λ“  μ‚¬λžŒμ„ 심사할 수 μ—†μŒμ„ μ˜λ―Έν•˜λ―€λ‘œ, leftλ₯Ό mid + 1둜 μ„€μ •ν•˜μ—¬ 더 λ§Žμ€ μ‹œκ°„μ„ ν• λ‹Ήν•©λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ, test_num이 n 이상이라면, μ΄λŠ” ν˜„μž¬ μ‹œκ°„(mid) 내에 λͺ¨λ“  μ‚¬λžŒμ„ 심사할 수 μžˆμŒμ„ μ˜λ―Έν•˜λ―€λ‘œ, answerλ₯Ό mid둜 μ„€μ •ν•˜κ³ , rightλ₯Ό mid - 1둜 μ„€μ •ν•˜μ—¬ 더 적은 μ‹œκ°„μ„ 할당해도 κ°€λŠ₯ν•œμ§€ ν™•μΈν•©λ‹ˆλ‹€.

이 과정을 leftκ°€ right보닀 컀질 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.

μ΅œμ’…μ μœΌλ‘œ answerμ—λŠ” λͺ¨λ“  μ‚¬λžŒμ„ 심사할 수 μžˆλŠ” μ΅œμ†Œ μ‹œκ°„μ΄ μ €μž₯λ©λ‹ˆλ‹€.

이 μ•Œκ³ λ¦¬μ¦˜μ€ 이진 탐색을 μ‚¬μš©ν•˜μ—¬ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 쀄이고, 효율적으둜 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.