길이가 0부터 시작하는 정수 배열 과 정수가 주어 지면 및 쌍의 개수를 반환합니다 . numsntarget (i, j) 0 <= i < j < n nums[i] + nums[j] < target
입력: nums = [-1,1,2,3,1], target = 2
출력: 3
설명: 명령문의 조건을 충족하는 인덱스 쌍이 3개 있습니다.
0 < 1이므로 - (0, 1) 및 nums[0] + nums[1] = 0 < target
입력: nums = [-6,2,5,-2,-7,-1,3], target = -2
출력: 10
설명: 명령문의 조건을 만족하는 인덱스 쌍이 10개 있습니다:
class Solution:
def count_pairs(self, nums, target):
nums.sort() # 배열을 정렬합니다.
n = len(nums)
count = 0
# 투 포인터를 이용하여 합이 target보다 작은 쌍의 개수를 세기
left = 0
right = n - 1
while left < right:
if nums[left] + nums[right] < target:
# nums[left]와 nums[right]를 포함하는 쌍들의 개수는 right - left입니다.
count += right - left
left += 1 # 더 작은 값을 만들기 위해 왼쪽 포인터를 오른쪽으로 이동합니다.
else:
right -= 1 # 합이 target 이상이면 더 큰 값으로 이동합니다.
return count
<내 코드의 흐름>
1. countPairs라는 메서드를 정의합니다. 이 메서드는 nums와 target 두 개의 매개변수를 받습니다. 이 메서드는 Solution 클래스의 인스턴스 메서드이므로 첫 번째 매개변수로 self를 받습니다.
2. sort()를 이용해 주어진 nums 리스트를 오름차순으로 정렬합니다.
3. 리스트의 길이를 변수 n에 저장합니다.
4.조건을 만족하는 쌍의 개수를 저장할 변수 count를 초기화합니다.
5. 왼쪽 포인터를 배열의 첫 번째 인덱스로 초기화합니다.
6. right = n - 1: 오른쪽 포인터를 배열의 마지막 인덱스로 초기화합니다.
7. while left < right: 왼쪽 포인터가 오른쪽 포인터보다 작은 동안 반복합니다.
8. 왼쪽 포인터와 오른쪽 포인터가 가리키는 값의 합이 target보다 작으면 아래 코드를 실행합니다.
9. count += right - left: 조건을 만족하는 쌍들의 개수를 right - left만큼 증가시킵니다. 왜냐하면 정렬된 배열에서 왼쪽 포인터가 고정된 상태에서 오른쪽 포인터가 이동하면서 조건을 만족하는 쌍들의 개수가 늘어나기 때문입니다.
10. left += 1: 왼쪽 포인터를 오른쪽으로 이동시켜 더 작은 값을 만듭니다.
11. else: 합이 target 이상이면 아래 코드를 실행합니다.
12. right -= 1: 오른쪽 포인터를 왼쪽으로 이동시켜 더 작은 값을 만듭니다.
13. return count: 조건을 만족하는 쌍의 개수인 count 값을 반환합니다.