문제
백준 2141번 - 우체국
아이디어
- 각 사람까지의 거리의 합이므로 좌우에 있는 사람 수가 최대한 균형된, 즉 중앙값에 속한 마을의 우체국을 설치하면 된다.
- 초기 입력 때 전체 사람 수를 구한 후 중앙값을 구한다.
- 마을을 위치 기준으로 정렬 후 한 마을씩 사람 수를 더하면서 중앙값 이상이 되는 순간 해당 마을 인덱스를 출력한다.
예상 시간 복잡도
코드 구현
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;
}
}
}
}