티스토리 뷰

알고리즘/백준

(백준) 제기차기 _ 23830

구름뭉치 2021. 12. 28. 16:28

https://www.acmicpc.net/problem/23830

 

🐢 설명

아주 간단한 이분탐색 문제이다. 결국 K를 찾기 위해 가능한 범위를 지정한 후 해당 범위내에서 K값을 지정해보고 이때의 평균값과 선생님이 원하는 S값과의 비교를 통해 범위를 조정해가면 된다.

 

평균을 높이기 위해서는 결국 K를 올려야 하므로 left = mid + 1, 평균을 낮추기 위해서는 K를 낮추기 위해 right = mid 로 해주면 된다. 가능한 가장 작은 K를 구해달라 하였으므로 lower bound로 구하면 된다.

 

여기서 놓칠 수 있는 부분은 문제의 첫 문장에 양의 정수 K라고 하였으므로 K의 하한 범위를 0이 아닌 1로 잡아줘야 한다.

 

🐢코드
public class 제기차기_23830 {
    static int N;
    static int[] point;
    static int p;
    static int q;
    static int r;
    static long S;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        point = new int[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            point[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        p = Integer.parseInt(st.nextToken());
        q = Integer.parseInt(st.nextToken());
        r = Integer.parseInt(st.nextToken());
        S = Long.parseLong(st.nextToken());

        binarySearch();
    }

    private static void binarySearch() {
        int left = 1;
        int right = 110000;
        int mid;

        while (left < right) {
            mid = (left + right) / 2;

            long avg = calc(mid);
            if (avg < S)
                left = mid + 1; // 평균 높여야 댐. -> K 키움
            else {
                right = mid; // 최대한 낮춘다. -> K 낮춤
            }
        }
        if (right == 110000) System.out.println(-1);
        else System.out.println(right);
    }

    private static long calc(int mid) {
        long sum = 0;
        for (int myPoint : point) {
            if (myPoint > mid + r) sum += myPoint - p;
            else if (myPoint < mid) sum += myPoint + q;
            else sum += myPoint;
        }
        return sum;
    }
}

 

🐢 마무리
반응형

'알고리즘 > 백준' 카테고리의 다른 글

(백준) 강수량 _ 2094  (0) 2022.02.02
(백준) 점심메뉴 _ 12099  (0) 2021.12.29
(백준) 인문예술탐사주간 _ 23829  (0) 2021.12.28
(백준) 넴모넴모 2020 _ 19845  (0) 2021.12.26
(백준) 휴게소 세우기 _ 1477  (0) 2021.12.23
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday