Programmers, μž…κ΅­μ‹¬μ‚¬

2021. 12. 4. 00:03ㆍETC/Algorithm

λ°˜μ‘ν˜•

πŸ”— 문제 링크

이뢄탐색 κ΄€λ ¨ 문제!

 

문제 μ„€λͺ…

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뢄에 λͺ¨λ“  μ‚¬λžŒμ˜ 심사가 λλ‚©λ‹ˆλ‹€.

 

 

 

문제 ν•΄κ²°

 

C++

#include <string>
#include <algorithm>
#include <vector>
typedef long long ll;

using namespace std;

long long solution(int n, vector<int> times) {
    sort(times.begin(), times.end());
    ll low = 0, high = times.back() * n;
    
    while (low != high) {
        ll mid = (low + high) / 2;
        ll pos = 0;
        for (int t: times) pos += mid / t;
        if (pos >= n) high = mid;
        else low = mid + 1;
    }
    
    return low;
}

 

κ°€λŠ₯ν•œ μ‹œκ°„μ„ 이뢄 탐색을 톡해 κ΅¬ν•©λ‹ˆλ‹€.

 

1) 처음 λ²”μœ„λŠ” [0, κ°€μž₯ 였래 κ±Έλ¦¬λŠ” 심사 μ‹œκ°„ * n] 으둜 μ„€μ •ν•©λ‹ˆλ‹€.

2) κ°€λŠ₯ν•œ μ‹œκ°„μ„ νƒμƒ‰ν•©λ‹ˆλ‹€.

2-1) mid 값을 ꡬ해 mid μ‹œκ°„ 내에 λͺ¨λ“  심사가 진행될 수 μžˆλŠ”μ§€ νŒλ‹¨ν•©λ‹ˆλ‹€.

2-2) μ΄λ•Œ, pos += mid / t λŠ” 각 μ‹¬μ‚¬λŒ€ λ§ˆλ‹€ 받을 μ‚¬λžŒλ“€μ„ νŒλ‹¨ν•©λ‹ˆλ‹€.

2-3) pos >= n , mid μ‹œκ°„μœΌλ‘œ κ΅¬ν•œ μˆ˜μš© 인원 (pos)이 n보닀 ν¬κ±°λ‚˜ κ°™λ‹€λ©΄ (κ°€λŠ₯μ„± μžˆλŠ” μƒνƒœ) 쑰금 더 μž‘μ€ κ°’μœΌλ‘œ μ‹œλ„ν•©λ‹ˆλ‹€. (high = mid) 

2-4) else, mid μ‹œκ°„μœΌλ‘œ κ΅¬ν•œ 수용 인원이 nλͺ… 보닀 λΆ€μ‘±ν•˜λ‹€λ©΄ 더 큰 κ°’μœΌλ‘œ μ‹œλ„ν•©λ‹ˆλ‹€.

 

 

 

λ°˜μ‘ν˜•

'ETC > Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Programmers, 징검닀리  (2) 2021.12.10
Programmers, λ³΄ν–‰μž 천ꡭ  (2) 2021.12.08
programmers, 단속카메라  (0) 2021.12.03
Programmers, 섬 μ—°κ²°ν•˜κΈ°  (2) 2021.12.02
Programmers, 단체사진 찍기  (0) 2021.12.02

Backend Software Engineer

Gyeongsun Park