백준 2141번 - 우체국

장근영·2024년 11월 26일
0

BOJ - 그리디

목록 보기
33/35

문제

백준 2141번 - 우체국


아이디어

  • 각 사람까지의 거리의 합이므로 좌우에 있는 사람 수가 최대한 균형된, 즉 중앙값에 속한 마을의 우체국을 설치하면 된다.
  • 초기 입력 때 전체 사람 수를 구한 후 중앙값을 구한다.
  • 마을을 위치 기준으로 정렬 후 한 마을씩 사람 수를 더하면서 중앙값 이상이 되는 순간 해당 마을 인덱스를 출력한다.

예상 시간 복잡도

  • 예상 시간 복잡도 : O(N log N)

코드 구현

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BJ_2141 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[][] arr = new int[n][2];

        long sum = 0;

        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int x = Integer.parseInt(st.nextToken());
            int a = Integer.parseInt(st.nextToken());

            sum += a;

            arr[i][0] = x;
            arr[i][1] = a;
        }

        long mid = (sum + 1) / 2;   //홀수 고려 +1
        long count = 0;

        Arrays.sort(arr, (a, b) -> a[0] - b[0]);

        for (int i = 0; i < n; i++) {

            count += arr[i][1];

            if (count >= mid) {
                System.out.println(arr[i][0]);
                return;
            }
        }
    }
}

profile
오늘 할 일을 내일로 미루지 말자.

0개의 댓글