Search

Count Pairs Whose Sum is Less than Target

문제 설명 : 제공된 숫자목록 중 2개를 골라 더 했을 때 target 숫자보다 작은 경우의 수를 구하는 문제
풀이 방법
일반적으로 O(N^2) 으로 순회하며 푸는 문제는 맞다. 그 방식으로도 solved가 가능하다.
하지만, 이 문제는 sorting 문제이기 때문에 sorting을 활용하여 시간 복잡도를 더 줄여볼 수 있다.
동일한 O(N^2) 이지만, sorting을 활용하면 탐색을 최대한 줄일 수 있다.
시간복잡도 : O(N2)O(N^2)
성공 코드
class Solution: def countPairs(self, nums: List[int], target: int) -> int: result = 0 # 오름차순 정렬 nums.sort() # 큰 수를 하나씩 확인하며, 작은 숫자와 더한다. for i in range(len(nums)-1, -1, -1): for j in range(i): # 범위를 넘어선다면, 바로 break하여 탐색을 최대한 줄인다. if nums[i] + nums[j] < target: result += 1 else: break return result
Python
복사
개선 코드(O(NlogN))
투포인터를 접목시켜 탐색을 줄인 방법이다.
탐색 부분의 시간 복잡도가 O(N^2) → O(N)으로 변경되었다.
class Solution: def countPairs(self, nums: List[int], target: int) -> int: result = 0 # 배열을 정렬합니다. nums.sort() left = 0 right = len(nums) - 1 while left < right: if nums[left] + nums[right] < target: # 현재 left부터 right까지 모든 쌍이 조건을 만족합니다. # (left, left + 1), (left, left + 2) ... (left, right) result += (right - left) # 작은 수 쪽의 포인터를 이동시켜 합산 값을 키워 재탐색한다. left += 1 else: # 큰 수쪽의 포인터를 줄여 합산 값을 줄여 재탐색한다. right -= 1 return result
Python
복사