문제
문제점 해결
해당 알고리즘을 이해하고 푼다면 쉽게 풀 수 있는 문제였지만 정말 초보적인 부분에서 실수를 했다. ㅠㅠ 패스가 안되고 런타임에러가 나서 무슨 문제인지 서치해보니 if 조건문 순서로 인해 발생한 에러였다..
오답 1
while (end != N) {
if (sum >= M) {
sum -= arr[st++];
} else if (sum < M) {
sum += arr[end++];
}
if (sum == M) {
count++;
}
}
위의 코드에서 틀린 부분은 While문의 조건이다. 만약 end가 N이 된다면 반복문을 끝내게 되는데 이러면 첫 번째 if문을 거쳐야 하는 부분이 있음에도 건너 뛰게 되므로 틀린 답을 출력하게 된다.
오답 2
while (true) {
if (sum < M) {
sum += arr[end++];
} else if(end == N){
break;
} else if (sum >= M) {
sum -= arr[st++];
}
if (sum == M) {
count++;
}
}
위의 코드에서 틀린 부분은 두 번째 조건문인 end == N 부분이다. 우선순위 첫 번째인 if 조건문을 거치고 나면 end 값은 이미 증가되므로 런타임 에러 (ArrayIndexOutOfBounds)가 발생하게 된다.
해결방법
sum과 M값을 비교하는 파라메터와 end와 N을 비교하는 파라메터는 독립적이라고 생각을 하고 조건문을 따로 작성했기 때문에 당연히 정답처리가 안되었다. end만 보고 반복문을 끝내버리면 sum에서 arr[st] 값을 빼는 경우가 있을 수 도 있는데 이걸 건너뛰어버리니 오답이 되었던 것이다.
풀이
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = sc.nextInt();
}
int st = 0, end = 0, sum = 0, count = 0;
while (true) {
if (sum >= M) {
sum -= arr[st++];
} else if (end == N) {
break;
} else if (sum < M) {
sum += arr[end++];
}
if (sum == M) {
count++;
}
}
System.out.println(count);
}
}