알고리즘

백준 2015번 수들의 합4 (JAVA)

박카스마시며코딩 2022. 7. 2. 22:32

https://www.acmicpc.net/problem/2015

 

2015번: 수들의 합 4

첫째 줄에 정수 N과 K가 주어진다. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N과 K 사이에는 빈칸이 하나 있다. 둘째 줄에는 배열 A를 이루는 N개의 정수가 빈 칸을 사이에 두고 A[1], A[2], ..., A[N]의 순서로

www.acmicpc.net

 

저는 Map을 통해 처음부터 현재 인덱스까지의 합을 key로 저장하고 value로  합의 개수를 저장하였습니다.

그리고 현재까지의 합을 저장하는 변수(sum)을 가지고 map에 sum-k가 있는지를 확인합니다.

sum - (sum-k) = k이기 때문에 sum-k를 map에서 찾습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_2015 {

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int k = stoi.apply(st.nextToken());
        Map<Long,Long> map = new HashMap<>();
        long sum = 0;
        st = new StringTokenizer(br.readLine());
        long result = 0;
        for(int i = 0 ; i < n ; i++){
            long num = stoi.apply(st.nextToken());
            sum += num;
            if(sum == k){
                result++;
            }
            long cnt = map.getOrDefault(sum-k,0L);
            result += cnt;
            map.merge(sum,1L, (v1,v2)->{
                return v1 +1L;
            });
        }
        System.out.println(result);
    }
}