[코딩테스트][백준] 🔥 백준 2473번 "세 용액" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 8월 18일
post-thumbnail

문제 링크

https://www.acmicpc.net/problem/2473

🛠️ 미해결

  • 풀이시간 : 2시간 이상
  • 문제 설명 : 주어진 수들 중에 3가지를 골라 합이 0에 가장 가까운 조합을 찾아서 출력하는 문제이다.
  • 틀린 이유
    • 이진 탐색에 개념에 얽매임 : 이진 탐색은 기본적으로 영역을 반씩 줄여감으로써 정렬된 수들 중 target을 찾아가는 문제이다. 그러다보니 영역을 반으로 줄이는 이진탐색에 개념에 너무 얽매인 나머지 영역을 반으로 줄이는 조건에 집착하고 있었다. 단순히 합을 통해 투포인터를 조절했다면 쉽게 풀 수 있는 문제였을 것이다. 즉, 개념에 대해 좁은 사고를 가지고 있었다. 이진탐색을 접했을 때, 영역을 반으로 줄이기 보다는 목표 값을 두고 목표값에 따라 탐색 영역을 조절하는 식의 개념으로 확장해서 생각해야 겠다.

📖 상세 설명

  1. 하나의 값 FIX : 앞에서부터 하나의 용액을 픽스하고 나머지 영역에서 합이 최소가 되는 값을 찾는다.
  2. 투 포인터 : 가장 왼쪽 값은 처음에 FIX된 값 +1의 포인터로 두고 가장 오른쪽 값은 n-1로 둔다. 합이 0보다 작으면 값을 증가시켜야 하므로 왼쪽 포인터를 오른쪽으로 이동시키고 그렇지 않다면 오른쪽 포인터를 왼쪽으로 이동시킵니다.

🕒 Python 풀이시간: x

n=int(input())
arr=list(map(int,input().split()))
arr.sort()

min_value=3e9
answer=[]

for i in range(n-2):
    left=i+1
    right=n-1
    while left<right:
        if abs(min_value)>=abs(arr[left]+arr[i]+arr[right]):
            min_value=arr[left]+arr[i]+arr[right]
            answer=[arr[i],arr[left],arr[right]]
        if arr[left]+arr[i]+arr[right]<0:
            left+=1
        elif arr[left]+arr[i]+arr[right]>0:
            right-=1
        else:
            answer=[arr[i],arr[left],arr[right]]
            break

print(*answer)

이렇게 Python으로 백준의 "세 용액" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글