제로칼로리 2022. 11. 23. 16:50

코드

import java.util.*;

// n개 == arr.length , 연속된 arr 배열 수 합이 m인 경우가 몇회인가?
class 연속부분수열 {

	public static void main(String[] args) {
		int 배열크기 = 50;
		int 합계 = 30;
		int[] arr = new Random().ints(배열크기, 1, 11).toArray();//1~10
		int answer = 0;
		System.out.println(Arrays.toString(arr));
		//핵심은 값을 증감 후 같을 수 있으니 검증로직을 한 번 더 태우는 것이다.
		for (int rt = 0, sum = 0, lt = 0; rt < arr.length;) {
			if (sum <= 합계) {
				if (sum == 합계) {
					prettyPrint(arr, lt, rt);
					answer++;
					sum -= arr[lt++];
				}
				
				sum += arr[rt++];
				
				if (sum == 합계) {
					prettyPrint(arr, lt, rt);
					answer++;
					sum -= arr[lt++];
				}
			} else {
				sum -= arr[lt++];
			}
		}
		System.out.println("총 카운트 = "+answer);
	}
	static void prettyPrint(int[] arr, int lt, int rt) {
		System.out.print("[lt="+lt+" rt="+(rt-1)+"]");
		Arrays.stream(arr, lt, rt).forEach(n->System.out.print(n+","));
		System.out.println();
	}
	
}

결과

[2, 9, 1, 3, 6, 4, 7, 4, 10, 4, 9, 10, 4, 6, 5, 2, 2, 5, 6, 3, 5, 10, 1, 8, 5, 9, 3, 8, 1, 5, 8, 6, 8, 2, 10, 8, 6, 8, 6, 1, 1, 7, 6, 5, 7, 7, 7, 9, 1, 3]
[lt=1 rt=6]9,1,3,6,4,7,
[lt=12 rt=18]4,6,5,2,2,5,6,
[lt=17 rt=22]5,6,3,5,10,1,
[lt=28 rt=33]1,5,8,6,8,2,
[lt=35 rt=40]8,6,8,6,1,1,
[lt=44 rt=47]7,7,7,9,
총 카운트 = 6