Algorithm

[HackerRank] Pairs

킹우현 2023. 5. 13. 12:56

def pairs(k, arr):
    # Write your code here
    # length = len(arr)
    count = 0
    
    new_set = set(arr)
    
    for ele in arr:
        target_one = ele+k
        target_two = ele-k
        
        if target_one in new_set:
            count += 1
        if target_two in new_set:
            count += 1
            
        new_set.remove(ele)
    
    # for i in range(length):
    #     for j in range(i+1,length):
    #         if abs(arr[i]-arr[j]) == k:
    #              count += 1
    return count

이번 문제는 주어진 배열(arr)과 타겟 값(k)가 주어졌을 때, 두 수의 차가 k인 쌍의 개수를 구하는 문제이다.

 

입력 값의 제한 사항에 2 <= n <10^5 일 때부터 눈치는 채고 있었지만, 2중 반복문을 사용하여 완전 탐색(Brute-force) 방식으로 풀이하게 되면 시간초과가 발생한다.

 

따라서 배열의 값들이 고유한 값이기 때문에 집합 자료형(new_set)으로 변환시켜준 후, '배열 값 +- k' 값이 new_set 안에 존재하는지 여부를 체크하고 존재한다면 카운팅(count + 1)을 시켜주면 된다.(집합 자료형의 in 연산자는 평균적으로 O(1)의 시간복잡도를 가진다.)

 

그리고 마지막으로 i 번째 값으로 카운팅을 한 후에 해당 값을 집합에서 제거해주지 않으면 다음 값들이 카운팅할 때 중복될 수 있다.

 

집합 자료형을 사용해서 시간초과를 해결할 수 있었던 좋은 문제였다 :)