1. ๋ฌธ์ ์ค๋ช ๐
1๋ฒ ํผ์ฆ
์ฌ์ฉ์์ ๋ ๋ฒจ์ด 1์ด๋ผ ํ์ ๋, ์ฒซ ๋ฒ์งธ ํผ์ฆ์ ์ฌ์ฉ์์ ๋ ๋ฒจ >= ํผ์ฆ์ ๋์ด๋ ์กฐ๊ฑด์ ๋ถํฉํจ์ผ๋ก ์๊ฐ์ 3๋ถ
๋๋ ค์ ํผ์ฆ์ ์๋ฃํ๋ค.
2๋ฒ ํผ์ฆ์ฌ์ฉ์์ ๋ ๋ฒจ
< ํผ์ฆ์ ๋์ด๋
์ด๋ค.
์ด ๊ฒฝ์ฐ ๋ฌธ์ ์ ์๊ตฌ์กฐ๊ฑด์ฒ๋ผ ์ง์ ํผ์ฆ์ (ํผ์ฆ์ ๋์ด๋
- ์ฌ์ฉ์์ ๋ ๋ฒจ
) ๋งํผ ๋ค์ ํ์ด์ผ ํ๋ค. ๊ทธ๋์ 2๋ฒ ํผ์ฆ์ ํธ๋๋ฐ๋ 1*3+4 = 7๋ถ
์ ์๊ฐ์ด ๋ ๋ค.
3๋ฒ ํผ์ฆ
์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ์์ ๋ ๋ฒจ
< ํผ์ฆ์ ๋์ด๋
์์ผ๋ก (ํผ์ฆ์ ๋์ด๋
- ์ฌ์ฉ์์ ๋ ๋ฒจ
)*4 + 2 = 10๋ถ
์ด ๋ ๋ค.
๋ฐ๋ผ์, ์ฌ์ฉ์์ ๋ ๋ฒจ์ด 1์ด๋ฉด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํธ๋๋ฐ ์ด 20๋ถ์ด ์์๋๋ค.
๋ฌธ์ ์์๋ limit
์ด๋ผ๋ ์ ํ์๊ฐ์ด ์ฃผ์ด์ง๋ค.
์ ํ ์๊ฐ ์์ ํผ์ฆ์ ๋ค ํ ์ ์๋ ์ต์ ๋ ๋ฒจ์ด ๋ช์ธ์ง ๊ตฌํ์ฌ๋ผ
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Binary_Search
ํ์ด์์ ๋ ๋ฒจ์ด ์ค๋ฅผ์๋ก ํผ์ฆ ํ์ด์ ์คํจํ๊ณ ๋ค์ ์ด์ ํผ์ฆ์ ํธ๋ ์๊ฐ์ด ์ฌ๋ผ์ ธ์ ์ ์ฒด ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ค์ด๋ค ๊ฒ์ด๋ค.
ํด๋น ๋ฌธ์ ์์๋ ์ ํ์๊ฐ๋ด๋ก ํ์ง๋ง, ๋ ๋ฒจ์ด ์ต์๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ผ๊ณ ํ๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ํ์๊ฐ ๋ด๋ก ๋ชจ๋ ํผ์ฆ์ด ํ๋ฉด์๋ ์ ํ์๊ฐ์ ์ ์ผ ๊ฐ๊น์ด ์์์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ ๋ฒจ
์ ๊ตฌํ๋ฉด ๋๋ค.
(1)ํ์ด์์ ์๋ จ๋๋ฅผ 1์ฉ ์ฌ๋ฆฌ๋ฉด์ ์์ ํ์์ผ๋ก ๊ตฌํ๋ค๋ฉด ์ด๋จ๊น?
์๊ฐ ์ด๊ณผ
๋ ๋ฒจ๊ณผ ๋น๊ต๊ฐ ๋๋๊ฐ๋
์ธ ํผ์ฆ ๋์ด๋๊ฐ 10์ 5์น๊น์ง ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ํ ์๊ฐ ๋ด์ ํ ์ ์๋ ๋ ๋ฒจ์ ์ต์๊ฐ์ ์์ ํ์์ผ๋ก ๊ตฌํ๋ ค๋ฉด 1๋ถํฐ 10์ 5์น๊น์ง ํ๋์ฉ ๋์กฐํด๋ด์ผ ํ๋ค.๋ ๋ฒจ ๋น ๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ณ์ฐ
, ๋ชจ๋ ๋ ๋ฒจ์ ๋ณด๊ธฐ
์ต๋ 10์ 5์น์ ์ ๊ณฑ์ ์๊ฐ์ด ๋ค์ด๊ฐ๋ค. ๋๋ต 1์ด์ 10์ต ๋ฒ ๊ณ์ฐํ ์ ์๋ ์ปดํ์ผ๋ฌ์ ๋ฅ๋ ฅ์ 10๋ฐฐ ์ด๊ณผํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐฉ์์ ์๊ฐ ํด์ผ ํ๋ค.
(2) ์ด๋ถ ํ์
a. ๊ตฌํ๋ ค๋ ๊ฐ(ans)
= ์ ํ์๊ฐ ๋ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๋ ๋ฒจ๋ค ์ค ์ต์ ๋ ๋ฒจ
b. ๋ฒ์
min
:100,000
(ํด๋น ์๋ ํผ์ฆ ๋์ด๋ ์ค ์ต์ ๋์ด๋์ด๋ค. ์ต์ ๋์ด๋๋ฅผ ํ ์ ์๋ ๋ ๋ฒจ์ด๋ผ๋ฉด ๋ชจ๋ ํผ์ฆ์ ์ต์ํ์ ์๊ฐ์ผ๋ก ๋ค ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์, min์ผ๋ก ๋๋ค.)max
:1
(ํผ์ฆ ๋์ด๋์ ์ต์๊ฐ์ด 1์ด๋ฏ๋ก level์ ์ต์๋ 1๋ก ๋์๋ค. ์ด๋ฌ๋ฉด ํผ์ฆ ๋์ด๋๊ฐ ์๋ฌด๋ฆฌ ์ฌ์๋ ๋ค๋ฅธ level์ ์๋ จ์์ ๋นํด์๋ ํด๊ฒฐ ์์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ค.)mid
:(min + max)/2
(๋์ ์ค๊ฐ๊ฐ)
c. ๋น๊ต
- ํผ์ฆ ํ์ด์๊ฐ
mid
๋ ๋ฒจ์ด๋ผ ์น ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ตฌํด์limit (์ ํ์๊ฐ)
๊ณผ ๋น๊ต - ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ตฌํ๋ ํจ์๋ฅผ
spending_time(int level)
์ด๋ผ๊ณ ์น ๋spending_time(mid) > limit
: max = mid+1 (์ ํ์๊ฐ ๋ด๋ก ๋ฌธ์ ๋ฅผ ๋ชป ํธ๋ ๋ ๋ฒจ์ด๋ฏ๋ก, ๋ ๋ฒจ์ ์ํฅ ์กฐ์ ํ๋ค.)spending_time(mid) <= limit
: min = mid-1 (์ ํ์๊ฐ ๋ด๋ก ๋ฌธ์ ๊ฐ ํ๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ์ต์๋ ๋ฒจ์ ์ฐพ์ ๋๊น์ง ๋ ๋ฒจ์ ํํฅ ์กฐ์ ํ๋ค.)
์ด๋ ๊ฒํ๋ฉด ์ด๋ ์๊ฐ, max๋ ์ ํ์๊ฐ ๋ด์ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ์ต์ ๋ ๋ฒจ์์ ๋ฉ์ถฐ์์ ๊ฒ์ด๊ณ , min์ ์ ํ์๊ฐ ๋ด์ ํ ์ ์๋ ๋ ๋ฒจ์ด์์ด๋, ๋ฌธ์ ๊ฐ ๋ค ํ๋ฆฐ๋ค๋ฉด ๊ณ์ ํํฅ๋๋ฏ๋ก ์ธ์ ๊ฐ๋ max์ ์๊ฐ๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋ค. ์๊ฐ๋ฆฐ ์๊ฐ min์ด ๊ฐ๋ฆฌํค๋ ๋ ๋ฒจ๋ก๋ ๋ ์ด์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ ํ ์๊ฐ ๋ด์ ํ ์ ์๊ณ , max๋ก๋ ํ ์ ์๊ฒ ๋๋ค. ์ด๋ max๊ฐ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ๋ ๋ฒจ ์ค ์ต์ ๊ฐ์ด๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.*;
// 1. ์ด๋ถ ํ์
// 2. max = level 1๋ก ๋ฌธ์ ํผ ์๊ฐ, min = level 10000์ผ๋ก ๋ฌธ์ ํผ ์๊ฐ, target = limit ๊ฐ
class Solution {
public int solution(int[] diffs, int[] times, long limit) {
return binary_search(diffs, times, limit);
}
public int binary_search(int [] diffs, int [] times, long limit) {
int max = 1; int min = 100000;
while (max <= min){
int level = (max+min)/2;
long mid = calcul(diffs,times, level);
// ์ ํ ์๊ฐ์ ์ด๊ณผํจ -> level ์์น
if(mid > limit) max = level + 1;
// ์ ํ์๊ฐ๋ณด๋ค ๋นจ๋ฆฌ ๋๋ด๊ฑฐ๋ ๋ฑ ๋ง์ถ ๋ -> level ํ๋ฝ
else min = level - 1;
}
return max;
}
public long calcul(int [] diffs, int [] times, int level) {
long ans = 0;
for(int i = 0; i < diffs.length; i++){
if(diffs[i] <= level) ans += times[i];
else ans += (long)(times[i] + times[i-1])* (long)(diffs[i] - level) + times[i];
}
return ans;
}
}
4. ์ถ์ ๐
min๊ณผ max๋ฅผ ๋ ๋ฒจ ์์ฒด์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ค์ ํ ๊ฒ ์๋๊ณ , ํด๋น ๋ ๋ฒจ๋ก ํ์์ ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ํ๋ค๋ณด๋, ํด๋น ๋ณ์๋ค์ ์๋ฏธ๊ฐ ์ง๊ด์ ์ด์ง ๋ชปํ๋ค. ๋ค์์ ํ๊ฒ ๋๋ค๋ฉด ํด๋น ์๋ฏธ๋ฅผ ์ข ๋ ์ง๊ด์ ์ผ๋ก ๋ณด์ํด์ผ๊ฒ ๋ค.