Coding Test/백준(Python)
[백준/Python] 2141번(그리디)_우체국
syunze
2023. 10. 10. 15:54
📌문제 유형
그리디, 정렬(골드 Lv.4)
📌문제
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 = int(input())
total = []
for _ in range(n):
total.append(list(map(int, input().split())))
total.sort(key = lambda x : -x[1])
result = []
cnt = 0
# max_idx까지만 반복
while cnt < len(total):
ans = 0
now_town = total[cnt][0]
for j in range(len(total)):
ans += (abs(total[j][0] - now_town) * total[j][1])
result.append([now_town, ans])
cnt += 1
result.sort(key = lambda x:x[1])
print(result[0][0])
📌 다른사람의 문제풀이
-아이디어 : 누적 인구수가 절반을 넘어가는 지점 찾기
- 이유 : 인구가 많으면 많을수록 거리값이 가산되기 때문에, 인구 수가 중요한 문제
import sys
input = sys.stdin.readline
villiage = []
all_people = 0
N = int(input())
for i in range(N):
n_viliage, people = map(int, input().split())
villiage.append([n_viliage, people])
all_people += people
villiage.sort(key= lambda x: x[0])
count = 0
for i in range(N):
count += villiage[i] [1]
if count >= all_people/2:
print (villiage[i][0])
break
📌 리뷰 및 참고
[백준] 2141번 우체국 (파이썬)
문제에서 요구하는 핵심은 어떤 한 마을에 우체국이 세워진다 가정할 때, 다른 마을 사람들이 우체국이 세워진 마을에 가기 위해 필요한 거리의 합이 최소가 되는 마을 번호를 찾는 것이다. 크
roytravel.tistory.com
[백준 2141번] 우체국(파이썬)
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, 0 ≤ A[i] ≤ 1,000,000,000
door-of-tabris.tistory.com
- 어떤 걸 곱하는지, 곱하면 커지는 값이 무엇인지 생각해보기
728x90