본문 바로가기
Algorithm/Baekjoon

2473. 세 용액 (Python)

by 원만사 2022. 6. 19.
반응형
 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

 

풀이

 두 용액(링크)과 유사한 문제로 투 포인터를 사용하여 문제를 해결할 수 있다. 문제는 총 3개의 용액을 더해야 한다는 것인데 3개의 포인터를 두고 탐색하되 하나의 포인터는 움직이지 않고 고정시킨다. 그리고 나머지 2개의 포인터를 기존의 두 용액에서와 마찬가지로 합이 양수냐 음수냐에 따라서 이동시켜가며 0에 가까운 세 용액을 구하면 된다.

 

코드

if __name__ == '__main__':
    N = int(input())
    values = list(map(int, input().split())) # 용액의 특성값들
    values.sort() # 오름차순 정렬

    res = [0, 0, 0] # 특성값이 0에 가장 가까운 용액을 만들어내는 경우
    zero = float('inf') # 0에 가장 가까운 특성값의 절댓값

    for i in range(N - 2): # 하나의 포인터는 고정시킨다. 0 ~ N-3 까지
        left, right = i + 1, N - 1 # 이동시키는 두 개의 포인터 

        while left < right:
            threeSum = values[i] + values[left] + values[right] # 세 개의 용액을 더한다.

            if abs(threeSum) < zero: # 0에 가장 가까운 용액을 발견하면 답을 갱신한다.
                zero = abs(threeSum)
                res[0], res[1], res[2] = values[i], values[left], values[right]

            if threeSum > 0: # 세 용액의 합이 양수면 right 포인터를 이동시킨다.
                right -= 1
            else: # 그 외의 경우는 left 포인터를 이동시킨다.
                left += 1

    print(*res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

2342. Dance Dance Revolution (Python)  (0) 2022.06.20
9252. LCS 2 (Python)  (0) 2022.06.20
2629. 양팔저울 (Python)  (0) 2022.06.18
13905. 세부 (Python)  (0) 2022.06.17
2251. 물통 (Python)  (0) 2022.06.16

댓글