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
투 포인터 첨 푸는 거라 보고했다 어쩔??
굉장히 상세하게 설명 해줬으니 밑에 참고 하시길..
https://m.blog.naver.com/kks227/220795165570
투 포인터(Two Pointers Algorithm), 슬라이딩 윈도우(Sliding Window) (수정: 2019-09-09)
조금 성향이 비슷하다고 생각하는 기법 2개를 함께 쓰려 합니다.첫 번째로 소개해드릴 기법은 투 포인터(tw...
blog.naver.com
package algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_2003 {
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 [] a = new int [N]; //입력 배열
int res = 0; //결과 값
int s = 0; //포인터 start, end
int e = 0;
int sum = s+e;
st = new StringTokenizer (br.readLine());
for(int i=0; i<N; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
while(true) {
if(sum >= M) { //합이 M 보다 크거나 같으면
sum -= a[s++]; //시작 값을 하나 증가시키고 그 배열 값을 뺀다
}else if(e == N) { //end 값이 배열 끝까지 가면 break
break;
}else { //합이 M 보다 작으면 end 값 증가시키고 이 배열 값을 더해준다
sum += a[e++];
}
if(sum == M) { //합이랑 M이 같을 때 결과 값 증가
res++;
}
}
System.out.println(res);
}
}
------------------------------------------------------------------------------------------
투 포인터 잊지 말자! 담엔 내 스스로 풀기
'백준알고리즘' 카테고리의 다른 글
백준 1806 부분합[투 포인터] (0) | 2020.04.20 |
---|---|
백준 2096 내려가기 [DP][슬라이딩 윈도우] (0) | 2020.04.19 |
백준 11403 경로 찾기 (0) | 2020.04.17 |
백준 2577 배열 숫자의 갯수 (0) | 2020.03.19 |
백준 10818 배열 최소, 최대 (0) | 2020.03.18 |
댓글