PS

[백준/Python] (S3) 친구와 배달하기 - 27370

MSHUN 2024. 3. 7.
반응형

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))

🧠풀이

무조건 가까이 있는 사람이 배달. 거리가 같다면 합이 적은사람이 배달.

🤔느낀 점

굳...

Baekjoon Online Judge

반응형

댓글