문제
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한다. 이때, 사용하는 자연수는 N이하여야 한다.
예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다.
N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 정수 N이 주어진다.
출력
입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int Num = scanner.nextInt();
int count = 1;
int start = 1;
int end = 1;
int sum = 1;
while(end != Num){
if(sum == Num){
count++;
end++;
sum += end;
}
else if(sum > Num){
sum -= start;
start++;
}
else{
end++;
sum += end;
}
}
System.out.println(count);
}
}
▶ int Num = scanner.nextInt() : 사용자로부터 연속된 합 개수를 구할 자연수를 입력받아 Num 변수에 저장함
▶ int count = 1 : 자연수 그 자체 값 만으로도 해당되기 때문에, 이 경우를 배제하고자 count를 1로 초기화하고 시작함
int start = 1;
int end = 1;
int sum = 1;
▶ start 인덱스와 end 인덱스를 모두 1로 초기화 하고, 이로 인해 더한 값을 저장하는 sum 변수도 1로 초기화 함
while(end != Num){
if(sum == Num){
count++;
end++;
sum += end;
}
else if(sum > Num){
sum -= start;
start++;
}
else{
end++;
sum += end;
}
}
▶ end 인덱스의 값이 자연수 Num과 같지 않을 때까지 반복문을 돌리며 연속된 자연수를 더한 값이 Num과 같은 경우의 수를 계산함
자연수 Num = 6
1) 연속된 자연수의 합이 자연수 Num과 같은 경우에는 count 값을 하나 늘리고 end 인덱스 값을 하나 더 늘린 후 sum 값에 end 값을 더해 저장함
{1, 2, 3}을 더한 sum 값이 Num과 같기 때문에 count는 2로 늘어나고, end 값은 4, sum 값은 10이 됨
2) 연속된 자연수의 합이 자연수 Num보다 큰 경우에는 sum 값에 start 값을 뺀 후 저장하고 start 값을 하나 더 늘림
{1, 2, 3, 4}을 더한 sum 값이 Num보다 크기 때문에 sum 값은 10 - 1 = 9가 되고, start = 2가 됨
3) 연속된 자연수의 합이 자연수 Num보다 작은 경우에는 end 값을 하나 더 늘리고 sum 값에 end 값을 더한 후 저장함
{2, 3}을 더한 sum값이 Num보다 작기 때문에 end=4가 되고, sum 값은 5 + 4 = 9가 됨
'Algorithm > BAEKJOON' 카테고리의 다른 글
[Java] 1253 좋다 (0) | 2023.04.12 |
---|---|
[Java] 1940 주몽 (0) | 2023.04.10 |
[Java] 10986 나머지 합 (0) | 2023.04.08 |
[Java] 11660 구간 합 구하기 5 (0) | 2023.04.07 |
[Java] 11659 구간 합 구하기 4 (0) | 2023.04.05 |