알고리즘

서버실 17245 자바

몽게구름 2025. 4. 6. 17:30

 

이번에 푼 문제는 백준의 서버실이라는 문제이다.

이 문제는 절반이상의 컴퓨터가 장애를 일으키지 않을 때 최소 시간을 구하는 것이다.

이분 탐색을 이용해서 풀면 된다.(매개 변수 탐색)

 

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