코딩 테스트/3. Tow pointers, Sliding window

Q3 - 5 연속된 자연수의 합

길동이이이잉 2021. 9. 8. 21:23
728x90
반응형

5. 연속된 자연수의 합

 

* 설명

N입력으로 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력하는 프로그램을 작성하세요.

만약 N=15이면

7+8=15

4+5+6=15

1+2+3+4+5=15

와 같이 총 3가지의 경우가 존재한다.

 

* 입력

첫 번째 줄에 양의 정수 N(7<=N<1000)이 주어집니다.

 

* 출력

첫 줄에 총 경우수를 출력합니다.

 

* 예시 입력 1 

15

* 예시 출력 1

3

 

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int in1 = in.nextInt();

		int sum = 0, answer = 0;
		for(int i = 2; i < in1; i++) {
			for(int k = 1; k<=i; k++) {
				sum = sum + k;
			}
			sum = in1 - sum;
			if(sum < 0) {
				break;
			}
			if(sum%i == 0) {
				answer++;
			}
			sum = 0;
		}
		
		System.out.println(answer);
		in.close();
		return;
        
//		슬라이드창으로 해보려고 했으나 실패	
//		우선 배열에 1234.....넣고
//		int[] tmp = new int[in1];
//		for(int i = 0; i <= in1; i++) {
//			tmp[i] = i;
//		}	
		///슬라이드 하려고 했는데 실패
//		int lt = 1, sum = 0, answer = 0;
//		for(int i = 0; i < in1; i++) {
//			sum += tmp[i];
//			if(sum < in1) {
//				
//			}else if(sum == in1) {
//				answer++;
//				sum = sum - tmp[lt];
//				lt++;
//			}else if(sum > in1) {
//				sum = sum - tmp[lt];
//				lt++;
//			}
//		}

	}
}

 

import java.util.Scanner;

public class Main {

//	솔루션 수학
	public int solution(int n) {
		int answer = 0, cnt = 1;
		n--;
		while(n>0) {
			cnt++;
			n = n-cnt;
			if(n%cnt == 0) answer++;
		}
		
	}
	
//	솔루션 two point
	public int solution(int n){
		int answer=0, sum=0;
		int m=n/2+1;
		int[] arr=new int[m];
		for(int i=0; i<m; i++) arr[i]=i+1;
		int lt=0;
		for(int rt=0; rt<m; rt++){
			sum+=arr[rt];
			if(sum==n) answer++;
			while(sum>=n){
				sum-=arr[lt++];
				if(sum==n) answer++; 
			}
		}
		return answer;
	}

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		System.out.print(T.solution(n));
	}
}
728x90
반응형