이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 (김태원)의 문제입니다.
문제 설명
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class sec03_04 {
public static int solution(int N, int M, int[] arr)
{
int count = 0, sum = 0;
int lptr = 0;
for (int rptr = 0; rptr < N; ++rptr)
{
sum += arr[rptr];
while (sum > M) sum -= arr[lptr++];
if (sum == M) count++;
}
return count;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());
System.out.println(solution(N, M, arr));
}
}
설명
- 투 포인터, 슬라이딩 윈도우 알고리즘을 복합적으로 사용해야 한다.
- lptr 포인터와 rptr 포인터를 사용하여 배열을 탐색한다.
- rptr 포인터는 배열의 처음부터 끝까지 이동하며, sum 변수에 현재 포인터가 가리키는 값을 더한다.
- sum이 M보다 클 경우, lptr 포인터를 이동시키면서 sum에서 값을 뺀다.
- sum이 M과 같아지면, count를 증가시킨다.
'자료구조 & 알고리즘 > Inflearn' 카테고리의 다른 글
[인프런 알고리즘] Chpater 3, 6번 문제(최대 길이 연속부분 수열) (0) | 2024.07.27 |
---|---|
[인프런 알고리즘] Chpater 3, 5번 문제(연속된 자연수의 합) (0) | 2024.07.26 |
[인프런 알고리즘] Chpater 3, 3번 문제(최대 매출) (1) | 2024.07.24 |
[인프런 알고리즘] Chapter 3, 2번 문제(공통원소 구하기) (1) | 2024.07.23 |
[인프런 알고리즘] Chpater3, 1번 문제(두 배열 합치기) (4) | 2024.07.22 |