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