Hello Ocean! 🌼

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μž…κ΅­ 심사 λ³Έλ¬Έ

Algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μž…κ΅­ 심사

bba_dda 2020. 9. 7. 19:41
λ°˜μ‘ν˜•

문제 μ„€λͺ…

nλͺ…이 μž…κ΅­μ‹¬μ‚¬λ₯Ό μœ„ν•΄ 쀄을 μ„œμ„œ 기닀리고 μžˆμŠ΅λ‹ˆλ‹€. 각 μž…κ΅­μ‹¬μ‚¬λŒ€μ— μžˆλŠ” μ‹¬μ‚¬κ΄€λ§ˆλ‹€ μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ‹€λ¦…λ‹ˆλ‹€.

μ²˜μŒμ— λͺ¨λ“  μ‹¬μ‚¬λŒ€λŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€. ν•œ μ‹¬μ‚¬λŒ€μ—μ„œλŠ” λ™μ‹œμ— ν•œ λͺ…λ§Œ 심사λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ μ•žμ— μ„œ μžˆλŠ” μ‚¬λžŒμ€ λΉ„μ–΄ μžˆλŠ” μ‹¬μ‚¬λŒ€λ‘œ κ°€μ„œ 심사λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 더 빨리 λλ‚˜λŠ” μ‹¬μ‚¬λŒ€κ°€ 있으면 κΈ°λ‹€λ Έλ‹€κ°€ 그곳으둜 κ°€μ„œ 심사λ₯Ό 받을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

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

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

μ œν•œμ‚¬ν•­

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

μž…μΆœλ ₯ 예

n times return
6 [7, 10] 28

μž…μΆœλ ₯ 예 μ„€λͺ…

κ°€μž₯ 첫 두 μ‚¬λžŒμ€ λ°”λ‘œ 심사λ₯Ό λ°›μœΌλŸ¬ κ°‘λ‹ˆλ‹€.

7뢄이 λ˜μ—ˆμ„ λ•Œ, 첫 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„κ³  3번째 μ‚¬λžŒμ΄ 심사λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

10뢄이 λ˜μ—ˆμ„ λ•Œ, 두 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„κ³  4번째 μ‚¬λžŒμ΄ 심사λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

14뢄이 λ˜μ—ˆμ„ λ•Œ, 첫 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„κ³  5번째 μ‚¬λžŒμ΄ 심사λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

20뢄이 λ˜μ—ˆμ„ λ•Œ, 두 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„μ§€λ§Œ 6번째 μ‚¬λžŒμ΄ κ·Έκ³³μ—μ„œ 심사λ₯Ό 받지 μ•Šκ³  1뢄을 더 κΈ°λ‹€λ¦° 후에 첫 번째 μ‹¬μ‚¬λŒ€μ—μ„œ 심사λ₯Ό λ°›μœΌλ©΄ 28뢄에 λͺ¨λ“  μ‚¬λžŒμ˜ 심사가 λλ‚©λ‹ˆλ‹€.

풀이

문제의 μΉ΄ν…Œκ³ λ¦¬κ°€ 이뢄탐색 이기도 ν–ˆμ§€λ§Œ, μž…λ ₯ λ²”μœ„λ₯Ό λ³΄μ•˜μ„ λ•Œ μ™„μ „νƒμƒ‰μœΌλ‘œλŠ” μ•ˆλ˜κ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.
λ”°λΌμ„œ μ΄λΆ„νƒμƒ‰μœΌλ‘œ ν’€μ΄ν–ˆλ‹€.

 

μ½”λ“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

unsigned long long solution(int n, vector<int> times) {
    unsigned long long answer = 987654321;
    unsigned long long left = 0; 
    unsigned long long mid = 0;
    sort(times.begin(), times.end());
    unsigned long long right = times[times.size()-1]*n; //μ΅œλŒ“κ°’
    answer = right;

    while (left <= right){
        unsigned long long done = 0;
        mid = (left + right) /2 ;
        for (int time:times){
            done += mid/time;
        }
        if (done < n) //주어진 μ‹œκ°„λ™μ•ˆ 심사 μ™„λ£Œ x
            left = mid + 1; //μ‹œκ°„ 늘리기 
        else { //주어진 μ‹œκ°„μ΄ μΆ©λΆ„ ν˜Ήμ€ λ”± λ§žλŠ” 경우
            if (mid < answer) //κ°€μž₯ λ”± λ§žλŠ” μ‹œκ°„μ„ μ°ΎκΈ° μœ„ν•΄ 
                answer = mid;
            right = mid-1; 
        }
    }
    return answer;
}

 

 


 

24λ…„ 8월에 λ‹€μ‹œ ν’€μ–΄λ΄€μŠ΅λ‹ˆλ‹€! (with Python)

 

Solution.

  • μž…λ ₯의 λ²”μœ„κ°€ 크기 λ•Œλ¬Έμ—, 완전탐색이 μ•„λ‹ˆλΌ 이뢄탐색을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • λͺ¨λ“  μ‚¬λžŒλ“€μ΄ 심사λ₯Ό λ°›κΈ° μœ„ν•œ μ΅œμ†Œμ˜ μ‹œκ°„μ„ 탐색
  • 0 ~ μ΅œλŒ“κ°’ 사이λ₯Ό 이뢄탐색
    • μ΅œλŒ“κ°’μ€ μ–΄λ–»κ²Œ ꡬ해야 ν•˜λŠ”κ°€?
      • 보톡 nλͺ… * maxμ‹¬μ‚¬μ‹œκ°„ 을 μ΅œλŒ“κ°’μœΌλ‘œ μ„€μ •ν•˜κ³  ν’€μ΄ν•˜λŠ” 것 κ°™μŒ (과거의 λ‚˜λ„...)
    • ν•˜μ§€λ§Œ, κ°€μž₯ μ΅œμ†Œμ˜ μ΅œλŒ“κ°’!은
      • nλͺ…/심사관 수 * maxμ‹¬μ‚¬μ‹œκ°„
      • λͺ¨λ“  μ‹¬μ‚¬κ΄€μ—κ²Œ nλͺ…을 κ³ λ₯΄κ²Œ λΆ„ν¬ν•˜λ©΄, 심사관 λ‹Ή nλͺ…/심사관 수 의 μ‚¬λžŒμ„ λ°°μ •λ°›κΈ° λ•Œλ¬Έ
      • 두 경우λ₯Ό λͺ¨λ‘ μ‹€ν–‰μ‹œμΌœλ³΄μ•˜λŠ”λ°, ν…ŒμŠ€νŠΈ3λ²ˆμ„ μ œμ™Έν•˜κ³  μ†Œμš”μ‹œκ°„μ΄ 적은 것을 확인할 수 μžˆλ‹€. 
        • μ†Œμš”μ‹œκ°„ : nλͺ…/심사관 수 * maxμ‹¬μ‚¬μ‹œκ°„ < nλͺ… * maxμ‹¬μ‚¬μ‹œκ°„ 

μ΅œλŒ“κ°’ : n * max(times)

 

μ΅œλŒ“κ°’ : (n // len(times) * max(times)

def solution(n, times):
    left = 0
    right = (n // len(times)) * max(times)
    answer = right
    
    while left <= right:
        mid = (left + right) // 2
        done = 0
        for t in times:
            done += mid//t
        if done >= n: # κ²€μ‚¬μ™„λ£Œ
            answer = min(answer, mid)
            right = mid - 1
        else: # μ‹€νŒ¨
            left = mid + 1
    return answer

 

λ°˜μ‘ν˜•