-
투포인터(백준 2003번), 슬라이딩 윈도우(자바)알고리즘 2022. 11. 11. 16:15
투포인터
: 부분 배열의 길이가 가변적일 때
배열의 합이 m인 부분 배열을 구한다고 하면
1. L ~ R 까지 부분배열의 합이 M보다 크면 L + 1
2. L ~ R 까지 부분배열의 합이 M보다 작으면 R + 1
3. L ~ R 까지 부분배열의 합이 M이면 L + 1, result 값 += 1
2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
import java.util.Scanner; 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 left = 0; int right = 0; int cnt = 0; int sum = 0; while (true) { if (sum >= m) { sum -= arr[left++]; } else if (right >= n) break; //right++을 수행하는 문장이 있으므로 그 전에 right >= n인지 확인한다 else sum += arr[right++]; //처음에 sum이 0이므로 이 문장을 수행하게 되기 때문에 ++right이 아니라 right++을 수행하여 arr[0]이 sum에 더해지도록 한다 if (sum == m) cnt++; //sum에 대해 조건에 따라 위의 연산을 마친 후 m과 같은지 비교한다 } System.out.println(cnt); } }
슬라이딩 윈도우
: 부분배열의 길이가 고정적일 때
길이가 고정이므로 포인터가 하나만 있어도 된다.
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[] arr = new int[n]; int sum = 0; int max = 0; int result = 0; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } for (int i = 0; i < n; i++) { sum += arr[i]; if (i == k-1) { max = sum; //초기 max값 } if (i >= k) { sum -= arr[i-k]; //한칸씩 뒤로 밀면서 sum 중 max 찾기 max = Math.max(max, sum); } } System.out.println(max); } }
참고
[알고리즘] 투 포인터, 슬라이딩 윈도우 알고리즘 자바 구현 (백준 2003, 2559) (tistory.com)
[알고리즘] 투 포인터, 슬라이딩 윈도우 알고리즘 자바 구현 (백준 2003, 2559)
투 포인터 알고리즘이란? ▶ 1차원 배열에 존재하는 순차적 부분 배열에 접근해야 할 때 두개의 점을 활용하여 중복 연산을 줄이는 알고리즘 예시 문제를 활용하여 알아보자. 문제 : https://www.acmi
hanyeop.tistory.com
'알고리즘' 카테고리의 다른 글
compareTo 비교 (0) 2023.04.06 2차원 배열 복사 (0) 2022.12.16 문자열 KMP 알고리즘 (0) 2022.10.18 순열, 중복순열, 조합, 중복 조합 알고리즘 (0) 2022.09.08 인덱스, 리스트 안에 배열, 2차원 ArrayList, ArrayList 안에 ArrayList (0) 2022.09.04