ํ๋ก๊ทธ๋๋จธ์ค Level3 : ์์ฐ
์ด๋ถ ํ์ binary search
์ด๋ถํ์์ ์กฐ๊ฑด : ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ์ด ๋์ด์์ด์ผ ํ๋ค.
๋ฒ์๋ฅผ ์ค์ฌ๊ฐ๋ฉด์ ๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ
max~min์ ์ค๊ฐ๊ฐmid ์ ์ํ์ ์ผ๋ก ์ ํด์ ์์ฐ์ ๊ณ์ฐ
์์ฐ์ ๋์ง์์๋ค๋ฉด : mid~max ์ฌ์ด๋ก ๋ฒ์๋ฅผ ์๋ก ์กฐ์
์์ฐ์ ๋์๋ค๋ฉด : min~mid ์ฌ์ด๋ก ๋ฒ์๋ฅผ ์๋ก ์กฐ์
์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ด ๊ฐ์์ง๋ ๊น์ง ๋ฐ๋ณต
class Solution {
public int solution (int [] budgets , int M ) {
int min = 0 ;
int max = 0 ;
for (int b : budgets ){
if (b >max ) max = b ;
}
int answer = 0 ;
while (min <= max ){
int mid = (min +max )/2 ;
int sum = 0 ;
for (int b :budgets ){
if (b > mid ){
sum += mid ;
} else {
sum += b ;
}
}
if (sum <=M ){
min = mid + 1 ;
answer = mid ;
} else {
max = mid - 1 ;
}
}
return answer ;
}
}
Stream์ผ๋ก ๋ฆฌํฉํ ๋ง
import java .util .stream .*;
class Solution {
public int solution (int [] budgets , int M ) {
int min = 0 ;
int max = IntStream .of (budgets ).max ().orElse (0 );
//IntStream.of(budgets).max() => ๋ฆฌํดํ์
: Optional(Int) : ๊ฐ์ด ์์ ์๋ ์์
//.orElse(0) => ๊ฐ์ด ์์ ๊ฒฝ์ฐ 0
int answer = 0 ;
while (min <= max ){
final int mid = (min +max )/2 ; // Stream์์์ ๊ฐ๋ณ๋ณ์๋ฅผ ์ฌ์ฉX-> final int
int sum = IntStream .of (budgets )
.map (b -> Math .min (b ,mid ))
.sum ();
if (sum <=M ){
min = mid + 1 ;
answer = mid ;
} else {
max = mid - 1 ;
}
}
return answer ;
}
}
import java .util .*;
class Solution {
int calBudget (int [] budgets , int limit ){
int total = 0 ;
for (int b : budgets ){
total += (b >limit )? limit : b ;
}
return total ;
}
int findLimit (int [] budgets , int M , int min , int max ){
int mid = (max +min )/2 ;
int calB = calBudget (budgets ,mid );
if (min >max ){
return max ;
}
if (calB >=M ){
max = findLimit (budgets ,M ,min ,mid -1 );
} else {
max = findLimit (budgets ,M ,mid +1 ,max );
}
return max ;
}
public int solution (int [] budgets , int M ) {
Arrays .sort (budgets );
int maxB = budgets [budgets .length -1 ];
int minB = budgets [0 ];
// ์์ฐ์์ฒญ์ด ์ ๋ถ ๊ฐ๋ฅํ ๊ฒฝ์ฐ
if (calBudget (budgets ,maxB )<=M ) return maxB ;
// ์ํ์ ์ด ํ์ํ ๊ฒฝ์ฐ
int answer = findLimit (budgets , M , minB , maxB );
return answer ;
}
}