이번에 푼 문제는 백준의 서버실이라는 문제이다.
이 문제는 절반이상의 컴퓨터가 장애를 일으키지 않을 때 최소 시간을 구하는 것이다.
이분 탐색을 이용해서 풀면 된다.(매개 변수 탐색)
import java.util.Scanner;
public class Main {
static int N;
static long totalComputer; //총합 컴퓨터
static int[][] computer;
public static void input() {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
computer = new int[N][N]; //서버실의 컴퓨터
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ;j++) {
computer[i][j] = scan.nextInt();
if(computer[i][j]!=0) { //총 합의 컴퓨터의 갯수를 구하기
totalComputer += computer[i][j];
}
}
}
binary_search();
}
private static void binary_search() { //매개 변수 탐색
long L = 10000001, R = 0, ans = Integer.MAX_VALUE;
while(L>=R) {
long mid = (L+R)/2;
if(chk(mid)) {
L = mid -1;
ans = Math.min(ans, mid);
} else {
R = mid +1;
}
}
if(ans==Integer.MAX_VALUE) {
ans = 0;
}
System.out.println(ans);
}
private static boolean chk(long mid) { //이부분 if문을 제거하고 좀더 간결한 코드로 수정이 가능할듯함
long count = 0;
long okComputer = totalComputer / 2 ==0 ? 1 :totalComputer / 2; //절반 나누고 0인 경우와 0이 아닌 경우
long okComputerNamuge = totalComputer % 2; //나눈후 절반 이 0 일때 아닐때 구분해야하기때문에
for(int i = 0 ; i < N ; i++) {
for(int j = 0 ; j < N ; j++) {
if(computer[i][j]!=0) {
if(computer[i][j]>=mid) {
count += mid;
} else {
count += computer[i][j];
}
}
}
}
if(okComputerNamuge!=0 && okComputer!= 1) {
if(okComputer < count) {
return true;
} else {
return false;
}
} else {
if(okComputer <= count) {
return true;
} else {
return false;
}
}
}
public static void main(String[] args) {
input();
}
}
chk() 메서드 안에 if(okComputerNamuge) 쪽은 수정이 가능 할거 같은데 일단 이렇게 놔둬야 겠다.
또한 많이 고치면서 수정하였는데
1.long 형 자료형을 사용 해야 함
2. 3대의 컴퓨터가 있을때 2로 나누면 1.5인데 1로만 받아 처리를 하여 틀렸습니다. 가 많이 나왔다.
double 형으로 처리를 해야 되나 싶다.
'알고리즘' 카테고리의 다른 글
| 백준 - 17836 공주님을 구해라! 자바 (3) | 2025.07.15 |
|---|---|
| 백준 - 17396 백도어 (1) | 2025.07.15 |
| 백준 - 2503 숫자야구 (1) | 2025.07.15 |
| 유클리드 호제법 (0) | 2025.07.15 |
| 백준 - 10845 큐 (0) | 2025.07.15 |