•
문제 설명 : 제공된 숫자목록 중 2개를 골라 더 했을 때 target 숫자보다 작은 경우의 수를 구하는 문제
•
풀이 방법
◦
일반적으로 O(N^2) 으로 순회하며 푸는 문제는 맞다. 그 방식으로도 solved가 가능하다.
◦
하지만, 이 문제는 sorting 문제이기 때문에 sorting을 활용하여 시간 복잡도를 더 줄여볼 수 있다.
▪
동일한 O(N^2) 이지만, sorting을 활용하면 탐색을 최대한 줄일 수 있다.
•
시간복잡도 :
•
성공 코드
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
복사