공부/알고리즘 및 기타 공부

투 포인터 알고리즘 (C#)

ENUM01 2023. 4. 24. 12:12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//배열은 정렬 되어있어야한다.
    //Comparer를 만족하는 개수 반환
    public static int CalculateCountWithTwoPointer(int[] arr, System.Func<intintbool> comparer)
    {
        // 배열이 비어있거나 comparer가 null인 경우 0을 반환
        if (arr == null || arr.Length == 0 || comparer == null)
        {
            return 0;
        }
 
        int count = 0// 조건을 만족하는 원소 쌍의 개수를 저장할 변수
        int left = 0;  // 왼쪽 포인터
        int right = 0// 오른쪽 포인터
 
        // 오른쪽 포인터가 배열의 끝에 도달할 때까지 반복
        while (right < arr.Length)
        {
            // comparer가 true인 개수 세기..
            if (comparer(arr[left], arr[right]))
            {
                count++;
                right++;      // 오른쪽 포인터를 이동
            }
            else
            {
                left++;       // 조건을 만족하지 않으면 왼쪽 포인터를 이동
                if (left > right)
                {
                    right = left; // 왼쪽 포인터가 오른쪽 포인터보다 클 경우, 오른쪽 포인터를 왼쪽 포인터와 같게 설정
                }
            }
        }
 
        return count; // 조건을 만족하는 개수 반환
    }
cs
  • 배열에서 인덱스 2개를 사용해야 할때 평범하게 for 문 2번으로 풀이하면 시간 초과가 발생하는 경우 생각해볼 수 있다.
  • 인덱스 2개를 while 문 한번으로 사용하면서 문제를 해결할 수 있다.
  • 구간 합도 공부하자.