https://www.acmicpc.net/problem/2003
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
투 포인터 알고리즘
리스트에서 두 개의 포인터를 이용해 순차적으로 접근합니다.
1. 첫 번째 원소와 마지막 원소에서 시작하는 경우
2. 둘 다 첫 번째 원소에서 시작하는 경우
문제 풀이 :
투 포인터에서, 2. 둘 다 첫 번째 원소에서 시작하는 경우를 사용하였습니다.
start = 0, end = 0 으로 시작합니다. 투 포인터는 start <= end 여야 합니다.
start < n까지 반복합니다.
1. 구간 합(sum)이 M을 초과하거나, end가 배열의 범위를 넘으면
sum-arr[start] , start 오른쪽 한칸 이동을 해줍니다.
2. 구간 합(sum)이 M과 같거나 이하일때, end가 배열의 범위를 넘지 않을 때
sum+arr[end] , end 오른쪽 한칸 이동 해줍니다.
만약 구간합(sum)이 M과 같다면 결과(count)를 증가시켜줍니다.
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 start = 0, end = 0, count = 0, sum = 0;
while(start < N) {
if(sum > M || end == N) sum-=arr[start++];
else sum+=arr[end++];
if(sum==M) count++;
}
System.out.println(count);
}
}
'ALGORITHM > 프로그래머스 | 백준 | 삼성 | 카카오' 카테고리의 다른 글
[백준] 13904 과제 java (0) | 2022.10.05 |
---|---|
[백준] 마법사 상어와 비바라기 java 21610번 (0) | 2022.04.05 |
[백준] 구간 합 구하기 4 java (0) | 2021.06.28 |
[프로그래머스] 게임 맵 최단거리 java (0) | 2021.06.24 |
[프로그래머스] 폰켓몬 java (0) | 2021.06.22 |