N입력으로 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력하는 프로그램을 작성하세요.
만약 N=15이면
7+8=15
4+5+6=15
1+2+3+4+5=15
연속된 자연수의 합이 n이 되려면 자연수의 가장 큰 값 m은 최대 n / 2 + 1이 된다.
그런 다음 배열 a를 m만큼의 크기로 선언하고 0번째 배열부터 자연수를 1부터 차례로 넣어준다.
이후 lt와 rt 두개의 포인터를 이용하여 sum에 배열의 rt키값만큼 더해주고 값이 작으면 rt를 증가시켜 준다.
다음 sum과 n을 비교하고 같으면 카운팅 해준다.
만약 sum이 n보다 작거나 같으면 배열의 lt키값만큼 빼주고 lt를 증가시켜준다.
이후 sum이 n보다 커질때 까지 위에줄을 실행시켜 준다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
class Main {
public int solution(int n) {
int answer = 0, sum = 0, lt = 0;
int m = n / 2 + 1; //연속된 자연수의 최대값 m
int[] a = new int[m]; //m 크기만큼 배열 생성
for (int i = 0; i < m; i++) {
a[i] = i + 1;
}
//rt 포인터 값만큼 증가시켜 주면서 sum에 rt 값만큼 넣어주고 n이랑 비교한다.
for (int rt = 0; rt < m; rt++) {
sum += a[rt];
if (sum == n) {
answer++;
}
// sum이 n보다 작거나 같은경우 sum에서 lt값만큼 빼주고 lt를 증가시킨다.
while (sum >= n) {
sum -= a[lt++];
if (sum == n) {
answer++;
}
}
}
return answer;
}
public static void main(String[] args) {
Main solution = new Main();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
/*int m = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}*/
System.out.println(solution.solution(n));
/*int m = scanner.nextInt();
int[] b = new int[m];
for (int i = 0; i < m; i++) {
b[i] = scanner.nextInt();
}*/
/*for (int x : solution.solution(n, m, a, b)) {
System.out.print(x + " ");
}*/
}
}