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
문제
수직선과 같은 일직선상에 N개의 마을이 위치해 있다. i번째 마을은 X[i]에 위치해 있으며, A[i]명의 사람이 살고 있다.
이 마을들을 위해서 우체국을 하나 세우려고 하는데, 그 위치를 어느 곳으로 할지를 현재 고민 중이다. 고민 끝에 나라에서는 각 사람들까지의 거리의 합이 최소가 되는 위치에 우체국을 세우기로 결정하였다. 우체국을 세울 위치를 구하는 프로그램을 작성하시오.
각 마을까지의 거리의 합이 아니라, 각 사람까지의 거리의 합임에 유의한다
입력
첫째 줄에 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 이며 모든 입력은 정수이다.
출력
첫째 줄에 우체국의 위치를 출력한다. 가능한 경우가 여러 가지인 경우에는 더 작은 위치를 출력하도록 한다.
코드
import sys
input = sys.stdin.readline
n = int(input())
town = [] # 마을 위치, 각 마을 인구수
total = 0 # 총 인구수
for i in range(n):
x, a = map(int, input().split())
town.append([x, a])
total += a
town.sort()
cnt = 0
for x, a in town:
cnt += a
if cnt >= total / 2:
print(x)
break
마을 위치 순으로 오름차순으로 정렬하고 각 마을의 인구수를 더해가며 그 값이 전체 인구수의 절반 이상이 되는 위치에 우체국을 건설하면 된다.
이분탐색으로 풀어보려다가 각 마을까지의 위치가 아닌 각 사람까지의 위치라고 해서 어떻게 풀까 고민해봤는데 도저히 모르겠어서 검색해봤더니 대부분 이렇게 풀었다.
'문제풀이 > Greedy' 카테고리의 다른 글
[Python/파이썬] 백준 21314번 민겸 수 (0) | 2023.07.22 |
---|---|
[Python/파이썬] 백준 13975번 파일 합치기 3 (2) | 2023.05.25 |
[Python/파이썬] 백준 13305번 주유소 (0) | 2023.02.14 |
[Python/파이썬] 백준 1541번 잃어버린 괄호 (0) | 2023.02.14 |
[Python/파이썬] 백준 11047번 동전 0 (0) | 2023.02.08 |