반응형
Baekjoon Online Judge의 27370번 친구와 배달하기 문제의 Python풀이입니다.
27370번: 친구와 배달하기
각 테스트 케이스의 결과인 두 정수를 각 줄에 출력한다. 첫 수는 두 사람의 이동거리 총합의 최솟값이고, 두 번째 수는 (두 사람의 이동거리 총합이 최솟값인 방법들 중 달성 가능한) 두 사람의
www.acmicpc.net
💻코드
# 입력된 테스트 케이스의 수만큼 반복
for _ in ' '*int(input()):
# n: 숫자의 개수, a와 b: 구간의 시작과 끝 지점
n, a, b = map(int, input().split())
# a가 b보다 크다면 값을 교환하여 a가 더 작도록 설정
if a > b: a, b = b, a
# h: 입력된 숫자들의 배열
h = list(map(int, input().split()))
# L, M, R: m을 기준으로 작은 값, m과 같은 값, 큰 값으로 나눈 리스트
L, M, R = [], [], []
# m: a와 b의 평균값
m = (a + b) / 2
# 입력된 숫자들을 m을 기준으로 L, M, R에 분류
for i in h:
if i < m: L.append(i)
elif i > m: R.append(i)
else: M.append(i)
# A: L에 있는 숫자들을 a로 만드는데 필요한 비용
# B: R에 있는 숫자들을 b로 만드는데 필요한 비용
A = sum(L) - len(L) * a
B = len(R) * b - sum(R)
# M에 있는 숫자들을 a나 b로 만드는 비용을 A와 B에 추가
for i in M:
if A < B: A += i - a
else: B += b - i
# 결과 출력: (A+B)*2는 총 비용, 2*abs(A-B)는 A와 B 사이의 차이
print((A + B) * 2, 2 * abs(A - B))
🧠풀이
무조건 가까이 있는 사람이 배달. 거리가 같다면 합이 적은사람이 배달.
🤔느낀 점
굳...

반응형
댓글