본문 바로가기
백준알고리즘

백준 2003 수들의 합 2 [투 포인터]

by tiit 2020. 4. 18.
반응형

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);


}

}

------------------------------------------------------------------------------------------

투 포인터 잊지 말자! 담엔 내 스스로 풀기

반응형

댓글