PS

백준 2141. 우체국

tose33 2023. 10. 15. 13:08

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

 

2141번: 우체국

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 X[1], A[1], X[2], A[2], …, X[N], A[N]이 주어진다. 범위는 |X[i]| ≤ 1,000,000,000, 1 ≤ A[i] ≤ 1,000,000,000 이며 모든 입력은 정수이다.

www.acmicpc.net

 

우체국은 양쪽으로 사람수가 가장 일정하게 퍼져있는 곳에 지어야 한다.

그 위치는 이분탐색으로 찾는다.

 

이분탐색으로 찾은 위치 mid 에서 왼쪽에 있는 사람들의수와 오른쪽에 있는 사람들의 수를 비교해야 하는데,

일일히 더하면 시간복잡도가 O(N^2) 가 된다.

따라서 누적합으로 구해놓으면 된다.

 

만약 마을 [1,mid] < (mid,N] 이라면 오른쪽에 사람이 더 많다는 것을 의미하기 때문에 오른쪽으로 이동한다.

아니라면 왼쪽으로 가면 된다.

 

 

 

 

 


그리디하게 찾는 방법도 있다.

 

우선 전체 사람수 total 을 구한다.

번호가 작은 위치부터 사람수를 더해나가다가 total 의 절반과 같거나 커지면 해당 위치가 왼쪽, 오른쪽에 사람들이 골고루 분포한 지점이다.

 

여기서 total 의 절반을 단순히 total/2 로 하면 안되고, total이 짝수라면 total/2, 홀수라면 (total+1)/2 를 해줘야 한다.