1. 투 포인터
포인터를 2개 사용하여 더 빠르게 배열을 탐색할 수 있다.
2. 예시문제
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
3. 설명
문제의 N의 크기가 100000이기 때문에 이중for문을 쓰면 시간 초과가 난다.
그렇기 때문에 투 포인터를 사용해야한다.
k개를 탐색한 경우 가장 마지막에 더한 값을 빼주고, 현재 값을 더하는 식으로 해결 가능
import java.util.Scanner;
public class back_2559수열 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int cnt = 0;//현재 선택한 갯수
int sum = 0;
int ans = -Integer.MAX_VALUE;
int arr[] = new int[100000];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
if(cnt<k) {
cnt++;
sum+=arr[i];
if(cnt==k) {
ans = ans < sum ? sum : ans;
}
}else {
if((sum>0 && arr[i-k]<0) || sum<0 && arr[i-k]<0)
sum+=Math.abs(arr[i-k]);
else
sum-=arr[i-k];
sum+=arr[i];
ans = ans < sum ? sum : ans;
}
}
System.out.println(ans);
}
}
가장 마지막에 더한 값이 음수라면 sum에 더해야 한다
if((sum>0 && arr[i-k]<0) || sum<0 && arr[i-k]<0)
sum+=Math.abs(arr[i-k]);
가장 마지막에 더한 값이 양수라면 sum에 그 값을 빼준다
sum-=arr[i-k];
현재 값을 더하고 최대값 갱신
sum+=arr[i];
ans = ans < sum ? sum : ans;
'알고리즘 > 코테에 필요한 지식만' 카테고리의 다른 글
다익스트라 알고리즘 (0) | 2020.09.27 |
---|---|
LIS 최장 증가 부분수열 (0) | 2020.09.24 |
순열과 조합 뿌시기 (0) | 2020.08.28 |
우선순위 큐 (0) | 2020.08.28 |
비트연산자 (0) | 2020.08.27 |