투포인터 이용! O(N)
N이 10,000,000으로 꽤 크다.
시간제한은 2초이므로, O(NlogN)까지만가도 2초가 넘는다.
따라서 O(N)으로 해결해야하며, 투포인터는 이에 해당한다.
N 입력받기
start = 0
end = 0
sum = 0
answer = 0
1~N까지 수가 차례대로 나열 된 배열 A
sum = A[start] + A[end]
if(N > sum) {
end ++
sum += A[end]
}
if( N < sum ) {
start --
sum -= A[start]
}
if( N == sum ) {
answer++
end ++
sum += A[end]
}
answer 출력
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int start = 1;
int end = 1;
int sum = 0;
int answer = 0;
for(; end<N+1; end++) {
sum = start + end;
if(N > sum) {
end ++;
sum += end;
}
if( N < sum ) {
start --;
sum -= start;
}
if( N == sum ) {
answer++;
end ++;
sum += end;
}
}
System.out.println(answer);
}
}
IDE에서 돌리고 예제(15)를 입력했을 때 결과가 0으로 나왔다.
start--
이 아니다.start--
를 했다. start++
를 해야한다! if-if-if
-> if- else if- else if
로 수정한다.end++ -> sum + end
sum - start -> start++
이다.import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int start = 1;
int end = 1;
int sum = 1;
int answer = 1;
for(; end<N+1;) {
if(N > sum) {
end ++;
sum += end;
}
else if( N < sum ) {
sum -= start;
start ++;
}
else if( N == sum ) {
answer++;
end ++;
sum += end;
}
}
System.out.println(answer);
}
}
처음에 많은것을 놓쳤었고 이를 다 수정했지만, 15를 입력했을 때 결과가 5로 나왔다. (결과는 4이어야한다)
디버깅을 해보니, for문의 조건식을 end<N+1로 줘서 end가 15일때 구간합을 구하고 N과 동일한지 체크하고 끝나는게아니라, end가 16으로 올라갈때까지 start를 변경할 수 있고 그 과정을 계속 수행한다.
따라서 start == end == 15 일때도 수행해서 answer이 하나 더 큰 5가 나오는것이었다.
end가 N에 도달하면, start가 어떻든 특정 구간합은 무조건 N보다 크게된다. 따라서 이후 과정은 필요없는 과정에 해당한다.
for()
-> while(N != end)
로 수정했다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int start = 1;
int end = 1;
int sum = 1;
int answer = 1;
while(end != N) {
if(N > sum) {
end ++;
sum += end;
}
else if( N < sum ) {
sum -= start;
start ++;
}
else if( N == sum ) {
answer++;
end ++;
sum += end;
}
}
System.out.println(answer);
}
}