๐ [๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ ํ์ด] Q.2805 ๋๋ฌด ์๋ฅด๊ธฐ ๋ฌธ์ ํ์ด - java
๐ ๋ฌธ์
https://www.acmicpc.net/problem/2805
์๊ทผ์ด๋ ๋๋ฌด M๋ฏธํฐ๊ฐ ํ์ํ๋ค. ๊ทผ์ฒ์ ๋๋ฌด๋ฅผ ๊ตฌ์ ํ ๊ณณ์ด ๋ชจ๋ ๋งํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์, ์ ๋ถ์ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ์์ฒญํ๋ค.
์ ๋ถ๋ ์๊ทผ์ด๋ค ์ง ๊ทผ์ฒ์ ๋๋ฌด ํ ์ค์ ๋ํ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ๋ด์ฃผ์๊ณ , ์๊ทผ์ด๋ ์๋ก ๊ตฌ์ ํ ๋ชฉ์ฌ์ ๋จ๊ธฐ๋ฅผ ์ด์ฉํด์ ๋๋ฌด๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
๋ชฉ์ฌ์ ๋จ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค. ๋จผ์ , ์๊ทผ์ด๋ ์ ๋จ๊ธฐ์ ๋์ด H๋ฅผ ์ง์ ํด์ผ ํ๋ค. ๋์ด๋ฅผ ์ง์ ํ๋ฉด ํฑ๋ ์ด ๋ ์ผ๋ก๋ถํฐ H๋ฏธํฐ ์๋ก ์ฌ๋ผ๊ฐ๋ค.
๊ทธ ๋ค์, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด๋ฅผ ๋ชจ๋ ์ ๋จํด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์, ๋์ด๊ฐ H๋ณด๋ค ํฐ ๋๋ฌด๋ H ์์ ๋ถ๋ถ์ด ์๋ฆด ๊ฒ์ด๊ณ , ๋ฎ์ ๋๋ฌด๋ ์๋ฆฌ์ง ์์ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด์ ๋์ด๊ฐ 20, 15, 10, 17์ด๋ผ๊ณ ํ์. ์๊ทผ์ด๊ฐ ๋์ด๋ฅผ 15๋ก ์ง์ ํ๋ค๋ฉด, ๋๋ฌด๋ฅผ ์๋ฅธ ๋ค์ ๋์ด๋ 15, 15, 10, 15๊ฐ ๋ ๊ฒ์ด๊ณ ,
์๊ทผ์ด๋ ๊ธธ์ด๊ฐ 5์ธ ๋๋ฌด์ 2์ธ ๋๋ฌด๋ฅผ ๋ค๊ณ ์ง์ ๊ฐ ๊ฒ์ด๋ค. (์ด 7๋ฏธํฐ๋ฅผ ์ง์ ๋ค๊ณ ๊ฐ๋ค) ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด๋ ์์ ์ ์ ๋๋ 0์ด๋ค.
์๊ทผ์ด๋ ํ๊ฒฝ์ ๋งค์ฐ ๊ด์ฌ์ด ๋ง๊ธฐ ๋๋ฌธ์, ๋๋ฌด๋ฅผ ํ์ํ ๋งํผ๋ง ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ค. ์ด๋, ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋
๋์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ ์ ๊ทผ๋ฒ
Q.2805 ๋๋ฌด ์๋ฅด๊ธฐ ๋ฌธ์ ์ ๋๋ค. ์ ๋จ๊ธฐ๋ฅผ ์ด์ฉํด ์ง ๊ทผ์ฒ์ ๋ชจ๋ ๋๋ฌด๋ค์ ์๋ผ ์ ์ด๋
์ด ํฉ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์๋ ๊ฒฝ์ฐ ์ค ์ ๋จ๊ธฐ ๋์ด๊ฐ ์ต๋๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
์๋ผ์ง ๋๋ฌด์ ๊ธธ์ด๊ฐ ์ ํํ M๋ฏธํฐ์ธ ๊ฒฝ์ฐ๋ง ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์๋๋ผ M๋ฏธํฐ ์ด์์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์
M๋ฏธํฐ ์ด์์ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํ์ธํด๋ด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋ฌด๋ค ์ค ์ ์ผ ๋์ ๋๋ฌด์ ๋์ด๋ณด๋ค ์ ๋จ๊ธฐ ๋์ด๋ฅผ ๋๊ฒ ์ค์ ํ๋ฉด
์๋ฆฌ๋ ๋๋ฌด๊ฐ ํ๋๋ ์์ผ๋ฏ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์ด๋ฅผ 0๋ถํฐ ์ ์ผ ๊ธด ๋๋ฌด ๋์ด-1 ๊น์ง ์ ๋จ๊ธฐ ๋์ด๋ฅผ ์ค์ ํด๋ณด๋ฉฐ
์ต๋๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ผ๋ฉด ๋ฉ๋๋ค.
์ ์ผ ์ฒ์์๋ ์ ํํ์์ผ๋ก 0๋ถํฐ ์ ์ผ ๊ธด ๋๋ฌด๋์ด -1 ๊น์ง ์ดํด๋ณด์๋๋
์๊ฐ ์ด๊ณผ๊ฐ ๋์๊ณ
์๊ฐ์ ์ค์ด๊ณ ํจ์จ์ ์ธ ํ์ด๋ฅผ ์ํด
binary search๋ฅผ ์ด์ฉํด์ ํ์ด๊ฐ ๊ฐ๋ฅํ์์ต๋๋ค.
๐ป ์ฝ๋
์ ํํ์์ ์ด์ฉํ ํ์ด 1 (์๊ฐ ์ด๊ณผ)
package problem.binary_search.Q2805;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class Main_2805_1 {
static int n, m;
static int trees[];
static int max = Integer.MIN_VALUE;
static int answer = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(answer);
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] temp = br.readLine().split(" ");
n = Integer.parseInt(temp[0]);
m = Integer.parseInt(temp[1]);
trees = new int[n];
temp = br.readLine().split(" ");
for(int i=0; i<n; i++){
trees[i] = Integer.parseInt(temp[i]);
max = Math.max(max,trees[i]);
}
br.close();
}
private static void solve(){
for(int h=0; h<max; h++){
int sum=0;
for(int i=0; i<n; i++){
if(trees[i] > h) {
sum += trees[i] - h;
}
}
if(sum >= m) {
answer = Math.max(answer, h);
}
}
}
}
binary search ๋ฅผ ์ด์ฉํ ํ์ด 2 (์ ๋ต)
package problem.binary_search.Q2805;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_2805_2 {
static int n, m;
static int trees[];
static int max = Integer.MIN_VALUE;
static int answer = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
input();
binarySearch();
System.out.println(answer);
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] temp = br.readLine().split(" ");
n = Integer.parseInt(temp[0]);
m = Integer.parseInt(temp[1]);
trees = new int[n];
temp = br.readLine().split(" ");
for(int i=0; i<n; i++){
trees[i] = Integer.parseInt(temp[i]);
max = Math.max(max,trees[i]);
}
br.close();
}
private static long caculateHeight(int h){
long sum=0l;
for(int i=0; i<n; i++){
if(trees[i] > h) {
sum += (trees[i] - h);
}
}
return sum;
}
private static void binarySearch(){
int start = 0;
int end = max;
while (start<=end) {
long sum;
int mid = (start+end)/2;
sum = caculateHeight(mid);
if(sum < m) {
end = mid-1;
}
else {
start = mid+1;
answer = Math.max(answer, mid);
}
}
}
}