1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
KEY WORD:
BINARY_SEARCH
์ด๋ฒ ๋ฌธ์ ์ ์ฃผ์ด์ง ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 10^5์ด๋ค. ์ฃผ์ด์ง ์๊ฐ ์ ํ์ด 2์ด์ด๋ฏ๋ก, 2์ต ๋ฒ์ ์ฐ์ฐ ํ์ ๋ด์ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค. ๋ง์ฝ ํด๋น ๋ฌธ์ ๋ฅผ ๋ธ๋ฃจํธ ํฌ์ค
๋ก ์ ๊ทผํด, ๋ชจ๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋๊ฒ ๋ค๊ณ ์๊ฐํ๋ฉด, ์ฐ์ฐ ํ์๊ฐ 10^5์ ์ ๊ณฑ์ธ 10 ์ต๋ฒ์ด ๋์ด ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ๋ค.
ํด๋น ๋ฌธ์ ๋ ์ด๋ถ ํ์(binary_search)
์ ์ด์ฉํด ํ ์ ์๋ค. ๊ณ ๋๋ ์ด๋ถ ํ์ ๋ฌธ์ ๊ฐ ๋ ๊ทธ๋ ๋ฏ, ๋๋์ฒด ๋ญ์ ๋ํด์ ์ด๋ถ ํ์์ ํด์ผํ๋์ง ๊ฐ ์ก๊ธฐ๊ฐ ํ๋ค๋ค. ๊ทธ๋์ ๊ฑฐ๊ธฐ์ ๋ถํฐ ์์ ํ๊ฒ ๋ค.
(1) ๋ฌด์์ ๋ํด์ ์ด๋ถ ํ์์ ํด์ผ ํ๋๊ฐ?
๋จผ์ ๋ฌธ์ ์์ ์ฃผ์ด์ง B[]์ด๋ ๋ฐฐ์ด์ ๋ํด์ ์์๋ณผ ํ์๊ฐ ์๊ฒ ๋ค. B[k] = x
์ด๊ฒ์ด ๋ฌด์์ ๋ปํ๋๊ฐ?
ํด๋น ํํ์ ๋ป์ x๋ ์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๊ฐ ์ต์ k๊ฐ ์๋ค
๋ ๋ป์ด๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ๊ด์ ์ ์ ํ์ด ํ์ํ๋ฐ, k ๋ฒ์งธ ์๋ฅผ ์ฐพ๊ฒ ๋ค๋ ์๊ฐ์ ํ์ง ๋ง๊ณ , x๋ฅผ ํ๋ ํํด์ ํด๋น ์๊ฐ ๋ช ๋ฒ์งธ ์์ธ์ง ๊ตฌํด์ k๊น์ง ๋์๊ฐ๋ค.
๋ผ๊ณ ์๊ฐ์ ํด์ผํ๋ค.
'์ด? x๊ฐ k๋ณด๋ค ํ์์๋ค? x๋ฅผ ์ค์ฌ์ผ์ง.', '์ด? x๊ฐ k๋ณด๋ค ์์ ์๋ค ๊ทธ๋ผ x๋ฅผ ๋์ฌ์ผ์ง' ์ ๊ฐ์ด up & down์ ํด๋๊ฐ๋ ๊ฒ์ด ์ข๋ค.
(2) ๊ทธ๋ผ x๊ฐ ๋ช ๋ฒ์งธ ์์ธ๊ฑด ์ด๋ป๊ฒ ์์์?
์๊ฐํด๋ณด๋ ๊ทธ๋ ๋ค. x๊ฐ ๋ช ๋ฒ์งธ ์์ธ์ง ๊ตฌํ ๋ ค๋ฉด 1๋ถํฐ ๋ ๋ค ์ธ์ด์ผ ํ๋ ๊ฒ ์๋๊ฐ? ํ์ง๋ง ํด๋น ๋ฌธ์ ์ 1์ฐจ์ ๋ฐฐ์ด์ด ์ฌ์ค A[i] [j] = i*j ๋ฅผ ๋ง์กฑํ๋ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๋ค์ ์ค๋ฆ ์ฐจ์ ์ ๋ ฌํ ๊ฒ์ด๋ฉด ์๋ฉด, ๊ท์น์ฑ์ ์ด์ฉํ์ฌ, ๋ธ๋ฃจํธ ํฌ์ค๋ฅผ ํ์ง ์๊ณ ๋ ๋ช ๋ฒ์งธ ์์ธ์ง ํ์ธํ ์ ์๋ค. ์ผ๋จ 2์ฐจ์ ๋ฐฐ์ด์ผ ๋์ ๋ชจ์ต์ ๋ณด์.
A[] [] | 1 | 2 | 3 | 4 |
---|---|---|---|---|
1 | 1 | 2 | 3 | 4 |
2 | 2 | 4 | 6 | 8 |
3 | 3 | 6 | 9 | 12 |
4 | 4 | 8 | 12 | 16 |
๊ท์น์ฑ์ด ๋ณด์ด๋๊ฐ?
ํ ๋ณ๋ก ์๋ผ์ ๋ณด๊ธฐ ๋ฐ๋๋ค. ๊ทธ๋ฌ๋ฉด ํด๋น 2์ฐจ์ ๋ฐฐ์ด์ด ๊ตฌ๊ตฌ๋จ
์ ํํ๋ฅผ ํ๊ณ ์์์ ์ ์ ์๋ค.
2์ฐจ์ ๋ฐฐ์ด์์ x๊ฐ ๋ช ๋ฒ์งธ ์์ธ์ง
๊ตฌํ๋ ค๋ฉด, ๊ฐ ํ์ ๋ด๋นํ๋ n์ผ๋ก x๋ฅผ ๋๋ด์ ๋ ๋์ค๋ ๋ชซ๋ค์ ๋ค ๋ํ๋ฉด ๋๋ค.
(x/n์ ๋ชซ์ ์ดํฉ
)
์๋ฅผ ๋ค์ด x=4๋ผ๊ณ ํด๋ณด์. 4๊ฐ ํด๋น 4*4 ๋ฐฐ์ด์์ ๋ช ๋ฒ์งธ ์์ผ๊น?
A[] [] | 1 | 2 | 3 | 4 | x = 4 ์ผ๋ x/n์ ๋ชซ |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 4 |
2 | 2 | 4 | 6 | 8 | 2 |
3 | 3 | 6 | 9 | 12 | 1 |
4 | 4 | 8 | 12 | 16 | 1 |
์ดํฉ์ 8์ด๋ค. ์ผ์ผํ ์ธ์ด๋ณด๋ฉด, 4๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๊ฐ ์ด 8๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด x = 12๋ฉด์ ๋ช ๋ฒ์งธ ์์ผ๊น?
A[] [] | 1 | 2 | 3 | 4 | x = 12 ์ผ๋ x/n์ ๋ชซ |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 12 => 4 |
2 | 2 | 4 | 6 | 8 | 6 => 4 |
3 | 3 | 6 | 9 | 12 | 4 |
4 | 4 | 8 | 12 | 16 | 3 |
๋ณด๋ค์ํผ 1
๊ณผ 2
์ ๊ฒฝ์ฐ ๊ฐ๊ฐ ๋ชซ์ด 12์ 6์ด ๋์์ง๋ง 4๊น์ง๋ก ์๋๋ค. ์ด์ ๋ ๊ฐ ํ ๋ณ๋ก ๋ฐฐ์์ ์ต๋ ๊ฐฏ์๊ฐ N๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๊ธฐ์ ์ ์ ์๋ ๊ฒ์ x๊ฐ ๋ช ๋ฒ์งธ ์์ธ์ง ๊ตฌํ ๋, Math.min(N, x/n)
์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
x = 12์ผ ๋, x๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ ์ด 15๊ฐ์ด๋ค.
์ ๋ชซ์ ์ดํฉ์ด ๊ณง ๊ทธ ์์ ์์น๋ฅผ ๋งํด์ค๊น?
๊ฐ ๊ตฌ๊ตฌ๋จ์ ๋ฐฐ์๊ฐ ๋๋ ์๋ฅผ n์ด๋ผ ํ ๋, x/n์ ๋ชซ์ ํด๋น ๊ตฌ๊ตฌ๋จ์์ ๋ช ๋ฒ์งธ ์๊น์ง x์ ์ดํ ๊ฐ
์ธ์ง ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. n = 2, x = 12์ผ ๋, 2์ 1๋ฐฐ์, 2์ 2๋ฐฐ์, 2์ 3๋ฐฐ์, 2์ 4๋ฐฐ์, 2์ 5๋ฐฐ์ 2์ 6๋ฐฐ์๋ x๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
(3) UpperBound, LowerBound ๋ญ ์จ์ผ ํด์?
ํด๋น ๋ฌธ์ ๋ Lower Bound
๋ฅผ ์จ์ผ ํ๋ค.
Lower Bound๋, ์ด๋ถํ์์ผ๋ก target ๊ฐ์ ์์ ์์น
๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. ๋ง ํน๋ณํ ๊ฒ์ ์๋๊ณ , ์ค๊ฐ๊ฐ < ํ๊ฒ ์ผ ๋๋ left = mid+1 ๋ก ์ฌ๋ผ๊ฐ๊ณ , ์ค๊ฐ๊ฐ => ํ๊ฒ์ด๋ฉด right = mid-1 ๋ก ๋ด๋ ค๊ฐ๋ค.
์์ธํ ์ค๋ช
์ ๋ค์ ๋ธ๋ก๊ทธ์ ์์ธํ ์ ํ ์๋ค. ๋ธ๋ก๊ทธ: Lower Bound & Upper Bound ๊ฐ๋
๋ฐ ๊ตฌํ
๋ฌ๋ผ์ง ์ ์ ์ค๊ฐ๊ฐ == ํ๊ฒ์ด์ด๋ ๋ด๋ ค๊ฐ๋ค๋ ๊ฒ์ด๋ค! ์ด๋ ๊ฒ ํ๋ฉด ์ฐพ๊ณ ์ ํ๋ target ๊ฐ์ ์ฒซ ์์ ์์น๋ฅผ ์ ์ ์๊ฒ ๋๋ค. ๋ค์ ์์์์๋ target = 3์ด๋ผ๊ณ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
value | 1 | 2 | 2 | 3 | 3 | 3 | 5 | 6 | 8 | 0 |
left | lower bound(3) | mid | right |
(arr[mid] = 3 ์ผ๋ก ์ด๋ฏธ ๊ฒฐ๊ณผ๋ ์ฐพ์์ง๋ง, right๋ index 3๊น์ง ๋ด๋ ค์ค๊ฒ ๋๋ค. ์ดํ left์ right๋ 3์์ ๋ง๋๊ฒ ๋๊ณ , ์ด๋ mid ๊ฐ์ (3+3) /2 ๋ก ๋ 3์ด ๋๋ฏ๋ก ๊ฒฐ๊ตญ right๋ index:2 ๊น์ง ๋ด๋ ค์จ๋ค. ์ด๋ start ๊ฐ์ด ๋ฐ๋ก lower bound๊ฐ ๋ฐ๋ผ๋ target์ ์์ ์์น๊ฐ ๋๋ ๊ฒ์ด๋ค.)
์ Lower Bound๋ฅผ ์จ์ผํด? ๊ทธ๋ฅ x๊ฐ k๋ฒ์งธ ์๊ฐ ๋์์ ๋ ๋ฐ๋ก ํ์ถํ๋ฉด ์๋ผ?
๋ผ๋ ์๋ฌธ์ด ๋ค ์ ์๋ค. ๊ฒฐ๋ก ์ x๊ฐ k๋ฒ์งธ ์์ผ ๋ ๋ฐ๋ก ํ์ถํ๋ฉด, ํด๋น x๊ฐ 2์ฐจ์ ๋ฐฐ์ด์์ ์กด์ฌํ์ง ์์๋ ์
์ผ ์ ์๋ค๋ ๊ฒ์ด๋ค.
x๋ฅผ ์ฐ์ ํด์, ๊ทธ x๊ฐ ๋ช ๋ฒ์งธ ๊ฐ์ธ์ง๋ก up or down์ ๊ฒฐ์ ํ๋ฏ๋ก ํด๋น ์ด๋ถ ํ์์์๋ x=index
k=value
์ด๋ค. N=5์ธ ๊ฒฝ์ฐ๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ํ๋ด๋ณด๊ฒ ๋ค.
x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
k | 1 | 2 | 5 | 8 | 10 | 12 | 12 | 14 | 15 | 17 | 17 | 19 | 19 | 19 | 21 | 22 | 22 | 22 | 22 | 24 | 24 | 24 | 24 | 24 | 25 |
์ฌ๊ธฐ์ ๊ตฌํด์ผ ํ๋ K = 17์ด๋ผ๊ณ ํด๋ณด์.
Loop1: start=1
, end=17
, mid=9
Loop2: start=10
, end=17
, mid=13
Loop3: start=10
, end=12
, mid=11
=> x=11์ผ ๋, ์ด๋ฏธ 17๋ฒ์งธ ์์ด๋ค. ํ์ง๋ง, 11์ NN ๋ฐฐ์ด์ ์กด์ฌํ๋ ์๊ฐ ์๋๋ค! (Lower Bound ์ง์)
Loop4: start=10
, end=10
, mid=10
=> ์ด ๋ค์์๋ Lower Bound์ ๋ฐ๋ผ end๊ฐ 9๋ก ์ค์ด๋ค๋ฉด์ start<=end๊ฐ ์ด๊ธ๋์ ์ด๋ถํ์์ด ์ข
๋ฃ๋๋ค.
์ด๋ start๊ฐ ๊ฐ๋ฆฌํค๋ 10์ด k=17์ ์์์ ์์ ์ ์ ์๋ค. k๊ฐ ๋ฐ๋๋ ์์์ ์ ์๋ ๊ฐ์ ๋ฌด์กฐ๊ฑด ์กด์ฌํ๋ค.
์๋ํ๋ฉด x๊ฐ K๋ฒ์งธ ์๋ผ๋ ์๋ฏธ๋ x๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฐ์ด K๊ฐ ์๋ค๋ ์๋ฆฌ์ธ๋ฐ, ๊ทธ๊ฒ์ ์ต์ ๊ธฐ์ค์ ๋ง์ถ๋ ค๋ฉด, ๋ฐฐ์ด ๋ด์ ์๋ ์ด๋ ์์์ฌ์ผ ๋ฑ ๋ง์ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ LowerBound๋ฅผ ํตํด ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ target ๊ฐ์ ์์ ์์น๋ฅผ ์ ์ ํด์ผ ํ๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
public class Main {
static int N,M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine());
// S์ E๋ B[] ๋ฐฐ์ด์ ๊ฐ์ด๋ค. ์๋ฅผ ๋ค์ด B[i] = 2 ๋ผ๋ฉด ์ค๋ฆ์ฐจ์์์ i๋ฒ์งธ ์๋ 2๋ผ๋ ์๋ฆฌ์ด๋ค.
long S = 1;
long E = K;
while(S<=E){
long x = (S+E)/2;
long loc = 0;
for (int i = 1; i <= N; i++) {
long now = Math.min(x/i, N);
if(now != 0) loc += now;
else break;
}
if(loc >= K) E = x-1;
else {
S = x+1;
}
}
System.out.println(S);
}
}