이번에 풀어본 문제는
백준 2003번 수들의 합 2 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int [] map;
static int N,M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; ++i) map[i] = Integer.parseInt(st.nextToken());
int res = 0;
int e = 0;
int sum = map[0];
for(int s = 0; s < N; ++s)
{
while(e < N && sum < M)
{
e++;
if(e != N) sum += map[e];
}
if(e == N) break;
if(sum == M) res++;
sum -= map[s];
}
System.out.print(res);
}
}
N개의 수로 구성된 수열에서 연속된 부분수열의 합이 M이 되는 경우의 수를 구하는 문제입니다.
0번 인덱스 부터 시작하여 투포인터를 사용하면 쉽게 해결할 수 있습니다.
현재 누적된 부분수열의 총합을 담고있는 sum이 M값보다 작다면 end값을 올려 부분수열의 범위를 넓히고, M보다 크거나 같다면 start를 올려 범위를 줄여나가면 됩니다. 이 과정에서 현재 부분수열의 합이 M값과 일치한다면 결과 카운트값을 1 증가시켜주며 start포인터를 올려 다음 부분수열을 계속 탐색해주면 됩니다.
오늘은 투포인터를 유형을 중심적으로 공부해보았습니다. 인덱스 하나차이로 에러나 일부 케이스에서 정확하지 않은 결괏값을 내기 때문에 조금 꼼꼼하게 확인해야하는 유형인 것 같습니다.
재미있는 문제에요.