코딩테스트 및 알고리즘

연속된 자연수의 합

영카이브 2024. 1. 2. 23:52

문제. 양의 정수 N이 입력되면 2개 이상의 연속된 자연수의 합으로 정수 N을 표현하는 방법의 가짓수를 출력하십시오.

 

입력예시 : 15

 

답 : 3

 

나의 답변 

import java.util.Scanner;

public class Main {	
	public int solution(int n){
		int answer=0, sum=0, end=0, lt=1; 
		if(n%2==1) end=n/2+1;
		else end=n/2-1; 
		for( int rt=1; rt<=end; rt++ ) {
			sum+=rt; 
			while(sum>n) {
				sum-=lt++; 
			}
			if(sum==n) answer++;  
		}
		return answer;
	}
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		System.out.println(T.solution(n));
	}
}

 

 

또 다른 방법

< 15개 공을 박스에 나눠 담는다고 가정하자 >

1. 첫번째 박스에 1개 담는다. = 박스  1개, 전체 공에서 1개를 뺌

2. 두번째 박스에 2개 담는다. ( 1씩 연속되어서 차이나도록 해주기 ) = 박스 1개 추가 후 1개를 빼고 남은 전체 공에서 공 2개를 뺌

3. 남은 공들은 2로 나눠 나머지없이 6개씩 공평히 담는다. 

4. 첫번째 박스엔 총 7개, 두번째 박스엔 총 8개 담긴다. >>>>>>>>> 연속되는 자연수다. 

5. 이번엔 박스를 3개로 가정한다. 

6. 기존 첫번째 박스에 1개, 두번째 박스에 2개는 두고 세번째 박스에 3개 담는다. = 박스 1개 추가 후 남은 전체 공에서 공 3개를 뺌 

7. 남은 공들은 3으로 나눈다. 남은 공이 9개이므로 3개씩 공평하게 담는다.

8. 첫번째 박스엔 총 4개, 두번째 박스엔 총 5개, 세번째 박스엔 총 6개 담긴다.  >>>>>>>>>  연속되는 자연수다.

9. 이번엔 박스를 4개로 가정한다.

10. 기존 첫번째 박스에 1개, 두번째 박스에 2개, 세번째 박스에 3개는 두고 네번째 박스에 4개 담는다. = 박스 1개 추가 후 남은 전체 공에서 공 4개를 뺌 

11. 남은 공들은 4로 나눈다. 남은 공이 5개 이므로 나머지가 4이다. >>>>>>>>> 남은 공을 공평하게 나눠 담을 수 없으므로 불연속하는 자연수가 된다. 

12. 이번엔 박스를 5개로 가정한다. 

13. 기존 첫번째 박스에 1개, 두번째 박스에 2개, 세번째 박스에 3개, 네번째 박스에 4개는 두고 다섯번째 박스에 5개 담는다. = 박스 1개 추가 후 남은 전체 공에서 공 5개를 뺌 

14. 남은 공이 없다. >>>>>>>>> 연속되는 자연수다.

* 빠지는 공의 개수와 더해지는 박스의 개수는 일치한다.

 

이 방법을 적용한 코드 

import java.util.Scanner;

public class Main {	
	public int solution(int ball){
		int answer=0, box=1;
		ball--; 
		while(ball>0) {
			box++;
			ball-=box++;
			if(ball%box==0)answer++; 
		}
		return answer;
	}
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		System.out.println(T.solution(n));
	}
}