algorithm/leetcode

K-diff Pairs in an Array [leetcode]

hoonzii 2022. 2. 9. 20:50
반응형

문제 풀이

리스트 안 숫자들 중 차이의 절대값이 k를 만족하는 숫자 쌍 의 개수를 찾는 문제다.

한국말로 한문장 정리하니 “의” 로 연결된게 많아 국어지문 푸는것 같다.

 

다시 정리하자.

  • 리스트 안 숫자들 중 ⇒ ex. [3,1,4,1,5]
  • 차이의 절대 값 ⇒ ex. |3 - 1| = 2
  • k를 만족하는 숫자 쌍 count! ⇒ ex. |3-1| == 2 ? (count +1) : nothing!

문제를 보면 리스트의 중복된 숫자가 있어도 1개로 친다고 한다. 그럼 로직상 중복체크도 필요하다는 얘기다.

 

나는 이렇게 풀었다.

현재 비교할 숫자 = nums[i]

비교 당해야 할 숫자들 = nums[i+1:] (중복을 피하기 위해 i 번째 이후 숫자들만 사용)

  • 중복을 피하기 위해 num_set 생성 ⇒ num_set = set(nums[i+1:])
  • nums를 순회하기 때문에 이전에 비교를 진행한 숫자를 제외하기 위해 alreay_use_num set 지정
  • num_set에 이전에 비교한 숫자가 있을경우, 중복 발생하므로 차집합 연산 진행 (num_set - already_use_set )

k = 0 일경우, 절대값 연산시 자기 자신이므로 num_set에 존재 유무 판단

num - k ⇒ ex. num=3, k=2 일경우, 3-2 = 1 이 num_set에 존재하는지 판단

num + k ⇒ex. num=3, k=2 일경우, 3+2 = 5 가 num_set에 존재하는지 판단

존재하면 count += 1 !

 

class Solution:
    def findPairs(self, nums: List[int], k: int) -> int:
        
        count = 0
        already_use_num = set()
        for i in range(len(nums)):
            num = nums[i]
            if num in already_use_num:
                continue
                
            nums_set = set(nums[i+1:]) - already_use_num
            if k == 0:
                if num in nums_set:
                    count+=1
            else:
                if num-k in nums_set:
                    count+=1
                if num+k in nums_set:
                    count+=1
            already_use_num.add(num)
        return count

 

반응형