1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
KEY WORD
: ์ด๋ถ ํ์
๋ฌด์์ ๊ธฐ์ค ์ผ๋ก ์ด๋ถํ์์ ํด์ผํ ๊น?
์ด๋ถ ํ์ ๋ฌธ์ ๋ฅผ ํ ๋, ์ ์ผ ์ด๋ ค์ด ๋ถ๋ถ์ด๋ค. ์ด๋ ค์ด ๋ฌธ์ ์ผ์๋ก ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ์ด๋ถ ํ์์ ํด์ผํ ์ง ๊ฐ์ด ์์ง ์๋๋ค. ๋ ๋ํ ๊ทธ๋ฌ๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ฌ๋์ ํ์ด ์์ด๋์ด๊น์ง ๋ดค๋ค. ๋ถ๋ช 1๋ ์ ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ฐฑ์ค์ผ๋ก ํ์๋๋ฐ, ์ ๋ ์ฌ๋ผ์ ์ข ์ข์ ํ๋ค ใ
(1) ๊ธฐ์ค : M ์๊ฐ ๋น ๊ฐ ์ฌ์ฌ๋์์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์
๋ด ๊ธฐ์ค์์ ์ด๋ ค์ ๋ ์ ์ ๊ท์น - ์ฌ์ฌ๋๊ฐ ๋น๋๋ผ๋, ์ฌ๋์ ๋ค๋ฅธ ์ฌ์ฌ๋๊ฐ ๋น ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
์๋ค. ์ด ์์จ์ฑ ๋๋ฌธ์, ๋ฌธ์ ์ ์ ํ์ ์๊ฐํ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ๊ธฐ์ตํด์ผํ ์ ์, ๋ฌด์์ ์ด๋ถ ํ์ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ ๋๋, ๋ฐํํ๋ ๋ต์ ๊ธฐ์ค
์ผ๋ก ํ์ํ ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ฐํด์ผ ํ๋ค๋ ์ ์ด๋ค.
ํด๋น ๋ฌธ์ ๋, N ๋ช ์ ์น๊ฐ์ด ์ฌ์ฌ๋๋ฅผ ํต๊ณผํ๋ ์ต์์ ์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ๊ทธ๋ฌ๋ฉด 0 ~ ์ต๋๋ก ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ฌ์ด๋ฅผ ์ด๋ถ ํ์ํ๋ฉด ๋๋ค. ๋ค์์ ์ด๋ฒ ๋ฌธ์ ์ ๊ธฐ์ค์ด๋ค.
๋ณ์ | ์ค๋ช |
---|---|
S | ์ด๋ถ ํ์์ ์ผ์ชฝ, ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํํ์ |
E | ์ด๋ถ ํ์์ ์ค๋ฅธ์ชฝ, ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ํ์ |
M | ์ค๊ฐ๊ฐ, ํ๋ฒ ์ฒดํฌํด๋ณผ ๊ฑธ๋ฆฌ๋ ์๊ฐ |
n | ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ฌ๋์ ์ |
M / times[i] | i๋ฒ์งธ ์ฌ์ฌ๋์์ M์๊ฐ ๋์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์ |
M / times[i]์ ์ดํฉ
: M์๊ฐ ๋์ ์ฌ์ฌ๋์์ ์ฒ๋ผํ๋ ์ฌ๋์ ์์ ์ดํฉ (์ดํ sum(M)
์ผ๋ก ํ๊ธฐ)
(2) ์ด๋ถ ํ์์ ๊ธฐ์ค
์ฝ๋ | ์ค๋ช |
---|---|
n > sum(M) |
M ์๊ฐ ๋์ ์ฌ์ฌ๋์์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์๊ฐ n๋ช
๋ณด๋ค ๋ถ์กฑํ๋ค. S ๋ฅผ ๋์ฌ์ M์๊ฐ์ ๋์ธ๋ค. |
n <= sum(M) |
M์๊ฐ ๋์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์๊ฐ n๋ช
์ด์์ด๋ค. E ๋ฅผ ์ค์ฌ์ M ์๊ฐ์ ์ค์ธ๋ค. |
(3) ์ ๊ทผ ๋ฐฉ์
- ์์ ์๊ฐํ ๋ณ์ S,E๋ฅผ ๊ตฌํ์ฌ M์ ๋งค๋ฒ ๊ตฌํ๋ฉฐ ์ด๋ถ ํ์ํ๋ค.
while(S <= E)
๋ก ํ๋ฉด E๊ฐ ๊ณ์ ๋ด๋ ค์์ ๊ฒฐ๊ตญ S์ ์๊ฐ๋ฆฐ๋ค. ์ดํ S๋ฅผ ๋ฐํํ๋ฉด ๊ทธ๊ฒ์ด ๋ต์ด๋ค.
(lower bound
์ด์ฉ -> ์ด์ 4๋ฒ์์ ํ์ )
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
class Solution {
// 10^9 -> ์๊ฐ ๋ณต์ก๋ O(n*log n) ์ดํ๋ก
public long solution(int n, int[] times) {
// 1. ์๊ฐ์ด ์ ์ผ ์ ๊ฒ ๊ฑธ๋ฆฌ๋ ์ฌ์ฌ๋ ์์ผ๋ก ์ ๋ ฌ
// 2. int start, int end ์ค์
// 3. ์ด๋ถํ์์ ํตํด, ์ต์๋ก ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ฐพ๊ธฐ (์ถ๋ ฅ)
Arrays.sort(times);
return binary_search(0, (long)times[times.length-1] * n, times, n);
}
public long binary_search(long start, long end, int [] times, int n) {
long S = start;
long E = end;
while(S<=E){
// ์ค๊ฐ ๊ฐ ๊ตฌํ๊ธฐ
long M = (S+E)/2; // ์ด ๊ฑธ๋ฆฌ๋ ์๊ฐ
// ์ค๊ฐ ๊ฐ์ ์ด์ฉํ ๋ค์ ํ๋ ๊ณ์ฐ
long people = 0;
for(int i = 0; i< times.length; i++){
people += M/times[i]; // ๊ฐ ์ฌ์ฌ๋๊ฐ ์ ํด์ง ์๊ฐ์์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์
}
// ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์๊ฐ ๊ฐ์ ์๊ฐ(๋ถ)์ ๋ํด์ ์ ์ผ ์ต์ ์๊ฐ์ ๊ตฌํด์ผ ํ๋ฏ๋ก lower bound
if(people >= n){
E = M-1;
}else {
S = M+1;
}
}
return S;
}
}
4. ์ฑ์ฅํ๊ธฐ
(1) sum(M) == n ์ด์ด๋ ํ์ถํ์ง ์๊ณ E๋ฅผ ์ค์ด๋ ์ด์ ?
sum(M) == n
, ์ฆ M ์๊ฐ ๋์ ์ฒ๋ฆฌํ๋ ์ฌ๋์ ์๊ฐ n์ธ ๊ฒฝ์ฐ์๋ E๋ฅผ ์ค์ด๋ฉฐ ์ด๋ถํ์์ ์ง์ํ๊ณ ์๋ค. ๊ทธ ์ด์ ๋ n๋ช
์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์ ์ ์ค ์ต์ ์๊ฐ์ ์ฐพ๊ธฐ ์ํด์
์ด๋ค. sum(M) == n์์ ์ฆ์ ํ์ถํ๋ฉด M์ด ์ต์๊ฐ์ธ์ง ์ ์๊ฐ ์๋ค. ํ์ง๋ง ํด๋น ๊ฒฝ์ฐ์๋ E๋ฅผ ๊ณ์ ๋ด๋ฆฌ๋ฉด ๊ฒฐ๊ตญ์ E๊ฐ sum(M) < n ์ธ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ
์ผ๋ก ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ S๋ sum(M) == n ์ธ ์ ์ค ์ต์๊ฐ
์์น์ ๋์ฐฉํ ํ ์์ง์ด์ง ์์ผ๋ฏ๋ก, S์ E๊ฐ ์๊ฐ๋ฆฌ๊ฒ ๋๊ณ , ์ด๋ S๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ต์ด ๋๋ค.