본문 바로가기

알고리즘 자료구조/백준

[백준] P2003 수들의 합2

728x90

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

 

🖊️문제

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.

 

🖊️문제 풀이

나는 이 문제를 투포인터를 이용해서 풀었다.

투포인터 관련 설명은 이 링크를 참고하시면 좋을 듯 해서 어떤 분이 올리신 깃허브 글 링크 달아두기루

https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Algorithm/%ED%88%AC%ED%8F%AC%EC%9D%B8%ED%84%B0%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98.md

 

투포인터 문제 중에서도 조금 쉬운 문제에 속하는 듯?

 

🖊️코드

package 투포인터;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class P2003 {

  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[] arr = new int[n];

    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < n; i++) {
      arr[i] = Integer.parseInt(st.nextToken());
    }

    int cnt=0;
    int sum = 0;
    int start = 0;
    int end = 0;

    while (true){
      if(end == n){
        break;
      }else if(sum < m){
        sum+=arr[end++];
      }else{
        sum-=arr[start++];
      }

      if(sum==m){
        cnt++;
      }
    }

    System.out.println(cnt);
  }

}
728x90

'알고리즘 자료구조 > 백준' 카테고리의 다른 글

[백준] P.3273 두 수의 합  (0) 2024.03.05
[백준] P2559 수열  (0) 2024.03.04
[백준] P2606 바이러스  (0) 2024.03.01
[백준] 10828 스택  (1) 2024.02.29
[백준] 11399 ATM  (0) 2023.09.17