반응형
[Gold IV] 수들의 합 4 - 2015
성능 요약
메모리: 40288 KB, 시간: 420 ms
분류
자료 구조, 해시를 사용한 집합과 맵, 누적 합, 트리를 사용한 집합과 맵
제출 일자
2024년 11월 14일 03:51:00
문제 설명
A[1], A[2], ..., A[N]의 N개의 정수가 저장되어 있는 배열이 있다. 이 배열 A의 부분합이란 1 ≤ i ≤ j ≤ N인 정수 i와 j에 대해 A[i]부터 A[j]까지의 합을 말한다.
N과 A[1], A[2], ..., A[N]이 주어졌을 때, 이러한 N×(N+1)/2개의 부분합 중 합이 K인 것이 몇 개나 있는지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N과 K가 주어진다. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N과 K 사이에는 빈칸이 하나 있다. 둘째 줄에는 배열 A를 이루는 N개의 정수가 빈 칸을 사이에 두고 A[1], A[2], ..., A[N]의 순서로 주어진다. 주어지는 정수의 절댓값은 10,000을 넘지 않는다.
출력
첫째 줄에 합이 K인 부분합의 개수를 출력한다.
제출코드
//https://www.acmicpc.net/problem/2015 import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // n, k 입력 받기(n:정수 수, k:합) int[] nk = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); int n = nk[0], k = nk[1]; // 배열 입력 받기 int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray(); long sum = 0 ; // 현재 위치까지의 합 HashMap<Long, Integer> cnt = new HashMap<>(); // sum의 등장 횟수를 저장 cnt.put(0L, 1); // 처음 sum은 0 long answer = 0; for(int i = 0; i < n; i++) { sum += arr[i]; // (sum - k)를 한 수가 한번 이상 등장했으면 해당 횟수만큼 answer에 추가. answer += cnt.getOrDefault(sum-k, 0); cnt.put(sum, cnt.getOrDefault(sum, 0) + 1); } System.out.println(answer); } }
728x90
반응형
'코딩 테스트 정복기 > 백준' 카테고리의 다른 글
[백준/Silver II] 알고리즘 수업 - 너비 우선 탐색 1 - 24444 (0) | 2024.11.22 |
---|---|
[백준/Gold IV] 여행 가자 - 1976 (0) | 2024.11.21 |
[백준/Gold V] 집합의 표현 - 1717 (0) | 2024.11.17 |
[백준/Gold IV] 단어 수학 - 1339 (0) | 2024.11.06 |
[백준/Gold IV] 카드 정렬하기 - 1715 (0) | 2024.11.05 |