연속된 자연수의 합
문제. 양의 정수 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));
}
}