알고리즘
백준 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);
}
}