시작점을 오른쪽으로 이동시키면 항상 합이 감소하고,
끝점을 오른쪽으로 이동시키면 항상 합이 증가한다는 것을 알 수 있다.
package java_0626_twoPointer;
import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] arr = new int[N+1];
        
        // 1부터 N까지 들어있는 배열
        for (int i = 1; i <= N; i++) {
			arr[i] = i;
		}
        
        int end = 1;
        int cnt = 0;
        int intervalSum = 0;

        // start를 인덱스 0부터 n까지 반복
        for (int start = 1; start <= N; start++) {
        	// 부분합이 res보다 작고,end 인덱스의 위치가 데이터의 개수보다 작을 때 실행
            while (intervalSum < N && end <= N) {
            	intervalSum += arr[end];
                end += 1;
            }
            if (intervalSum == N) {
                cnt += 1;
            }
            intervalSum -= arr[start];
        }

        System.out.println(cnt);
    }
}

N을 입력받고, 1~N까지 순차적으로 들어있는 배열을 만든다.

시작점과 끝점을 모두 맨 앞으로 위치시키고, 시작점이 끝까지 갈 때까지 계속 반복한다.

부분합을 0으로 초기화 시킨 후 끝점을 한칸씩 이동하면서 원하는 값이 N이 될 때까지 반복한다.

부분합이 N을 만족한다면, cnt++,
부분합이 N보다 커진다면, 시작점을 오른쪽으로 옮겨 합을 감소시킨다.
부분합이 N보다 작다면, 끝점을 오른쪽으로 이동시켜 합을 증가시킨다.

 

이를 계속 반복하다가 시작점이 배열의 끝까지 이동했다면, 반복문을 종료시킨 후

이를 만족하는 cnt의 개수를 출력한다.

 

+ Recent posts