[백준 파이썬] 2473 세 용액

RG-Im·2023년 5월 1일
1

알고리즘

목록 보기
11/28

백준 2473

백준 2467번과 같은 똑같은 문제다. 용액 하나를 더 쓰는 차이인데 입력의 수가 5000개 밖에 되지 않기 때문에 이중 반복문과 두 포인터를 사용하면 된다.

N = int(input())
sol = list(map(int, input().split()))
sol.sort() # 두 포인터로 순서대로 찾기 위해 용액 정렬

def find_best(): # 합이 0인 경우 바로 반복문 종료를 위해 함수로 선언
    best_sol = 10**12 
    best_sol_lst = []

    for i in range(N-2): # 처음 고르는 용액은 0 번째부터 마지막에서 두 번째까지
        start, end = i+1, N-1 # 나머지 두 용액은 i+1 번째부터 마지막까지 탐색
        while start < end: # 같은 용액이 포함되면 안되므로 등호는 빼줘야한다
            mixture = sol[start] + sol[end] + sol[i] # 세 용액의 특성값 합

            if abs(mixture) < best_sol: # 기존값보다 합이 0에 더 가깝다면
                best_sol = abs(mixture) # 값 업데이트
                best_sol_lst = [sol[start], sol[end], sol[i]] 최저 용액 조합 저장

            if mixture > 0: # 합이 0보다 크다면
                end -= 1 # 마지막 인덱스를 줄여 특성값 합 낮추기
            elif mixture < 0: # 작다면
                start += 1 # 반대로 높이기
            else: # 0이 된다면 바로 종료
                return best_sol_lst
    else: 가장 낮은 값이 나오는 용액 조합 반환
        return best_sol_lst

ans = find_best()
ans.sort() 
print(*ans)
profile
공부 저장용

0개의 댓글