[Leet Code] 16. 3Sum Closet

  • 이번 포스팅에서는 Leet Code 16번 3Sum Closet 문제를 다룬다.

Problem

  • Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target.
  • Return the sum of the three integers. You may assume that each input would have exactly one solution.

Example 1:

Input: nums = [-1,2,1,-4], target = 1
Output: 2
Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

Solution :

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        answer = 0
        dist = 1000000000000000
        nums.sort()
        for idx, num in enumerate(nums):
            if idx == len(nums) - 2:
                break
            left, right = idx + 1, len(nums) - 1
            while left < right:
                sum = num + nums[left] + nums[right]
                abs_num = abs(sum - target)
                if dist > abs_num:
                    answer = sum
                    dist = abs_num
                if sum < target:
                    left += 1
                elif sum > target:
                    right -= 1
                else:
                    return answer
        return answer

  • 3sum 문제와 비슷하다.
  • 세개의 원소의 합이 target과 가장 가까운 값을 찾아내는 문제이다.
  • 3sum 문제와 비슷한 발상에서 시작하는데, 완전탐색으로 하기엔 nums 리스트의 범위가 1000이므로, 삼중포문을 하기엔 시간제약이 생긴다.
  • 역시 정렬을 하여 논리적으로 더이상 보지 않아도되는 부분은 가지치기를 하였고, a+b+c에서 a를 기준으로 잡고, b와 c를 투포인터를 이용하여 이중포문으로 해결하였다.

댓글남기기