2중 for문으로 풀지 말자! 시간 복잡도가 커진다.
위에서 했던 방법과 일치한다.
배열의 크기는 입력값 N의 N/2 + 1 만큼 해준다.
배열
arr[0] = 1, arr[1] = 2, arr[2] = 3, arr[3] = 4 ,...
배열의 값은 위와 같은 식으로 넣어 준다.
public int solution(int n){
int answer= 0, sum =0, lt=0;
int m=n/2+1;
int[] arr = new int[m];
for(int i=0;i<m;i++)
arr[i] = i+1;
for(int rt=0;rt<m;rt++){
sum+= arr[rt];
if(sum == n)answer++;
while(sum >= n){
sum -= arr[lt++];
if(sum==n)
answer++;
}
}
생각 순서
위와 같은 수학적인 방법으로 문제를 풀 수 있다.
public int solution(int n){
int answer = 0, cnt = 1;
n--;
while(n>0){
cnt++;
n = n -cnt;
if(n%cnt ==0) answer++;
}
return answer;
}
package algolecture;
import java.util.Scanner;
public class Main29 {
public int solution(int n){
int answer= 0, sum =0, lt=0;
int m=n/2+1;
int[] arr = new int[m];
for(int i=0;i<m;i++)
arr[i] = i+1;
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) {
Main29 T = new Main29();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
System.out.print(T.solution(n));
}
}
package algolecture;
import java.util.Scanner;
public class Main29math {
public int solution(int n){
int answer = 0, cnt = 1;
n--;
while(n>0){
cnt++;
n= n-cnt;
if(n%cnt==0) answer++;
}
return answer;
}
public static void main(String[] args) {
Main29math T = new Main29math();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
System.out.print(T.solution(n));
}
}