백준 2015 [자바] java 수들의 합4
문제 링크: 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
▶문제
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인 부분합의 개수를 출력한다.
▶해설
첫 번째로 풀었을 때는 dp를 이용하기 위해 List[] 배열을 이용해서 윗 값에서 추출하는 식으로 풀었습니다.
1<=N<=200,000 값이 크므로 메모리 초과가 떴습니다. 그래서 Map을 이용했습니다.
arr = 배열
sum = 배열을 차례대로 더한 값
ex)
arr = {2,-2,2,-2}
sum = {2,0,2,0}
이때 sum[i]-k ==0 일 때를 구해줍니다.
map.put(0,1) -> 합==k일 경우를 생각하여 1을 넣어줍니다.
count+=map.getOrDefault(sum[i]-k, 0) -> key값에 해당하는 값이 있다면 해당 값을 반환하며, 없다면 0을 반환합니다. 만약 sum[i]-k==0이라면 기존에 넣었던 1이 반환되며, count가 증가됩니다.
map.put(sum[i], map.getOrDefault(sum[i],0)+1) -> sum[i]의 해당하는 key값이 있었다면 해당 값 +1 을 해주며, 없었다면 0+1을 하여 sum[i]의 갯수의 합을 올려줍니다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { static int n,k; static int [] arr; static int [] sum; static int count; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s = br.readLine().split(" "); n = Integer.parseInt(s[0]); k = Integer.parseInt(s[1]); arr = new int[n+1]; sum = new int[n+1]; String[] s1 = br.readLine().split(" "); for(int i=1; i<=n; i++){ arr[i]=Integer.parseInt(s1[i-1]); sum[i]=sum[i-1]+arr[i]; } solve(); System.out.println(count); } public static void solve() { HashMap<Integer, Integer> map = new HashMap<>(); map.put(0,1); for(int i=1; i<=n; i++){ count+=map.getOrDefault(sum[i]-k, 0); map.put(sum[i],map.getOrDefault(sum[i],0)+1); } } }

'Alogorithm' 카테고리의 다른 글
백준 1477 [자바] java 휴게소 세우기 (0) | 2022.02.07 |
---|---|
백준 21275 [자바] java 폰 허석만 (0) | 2022.01.26 |
백준 JAVA 9613 GCD 합 (0) | 2021.12.31 |
백준 JAVA 2407번 조합 (0) | 2021.12.30 |
백준 JAVA 9342번 염색체 (0) | 2021.12.21 |
댓글
이 글 공유하기
다른 글
-
백준 1477 [자바] java 휴게소 세우기
백준 1477 [자바] java 휴게소 세우기
2022.02.07문제 링크: https://www.acmicpc.net/problem/1477 1477번: 휴게소 세우기 첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. 둘째 줄에 현재 휴게소의 위치가 공백을 사이에 두고 주어진다. www.acmicpc.net ▶문제 다솜이는 유료 고속도로를 가지고 있다. 다솜이는 현재 고속도로에 휴게소를 N개 가지고 있는데, 휴게소의 위치는 고속도로의 시작으로부터 얼만큼 떨어져 있는지로 주어진다. 다솜이는 지금 휴게소를 M개 더 세우려고 한다. 다솜이는 이미 휴게소가 있는 곳에 휴게소를 또 세울 수 없고, 고속도로의 끝에도 휴게소를 세울 수 없다. 휴게소는 정수 위치에만 세울 수 있다. 다솜이는 이 고속도로를 이용할 때, 모든 … -
백준 21275 [자바] java 폰 허석만
백준 21275 [자바] java 폰 허석만
2022.01.26문제 링크: https://www.acmicpc.net/problem/21275 21275번: 폰 호석만 만약 문제의 조건에 맞는 X, A, B가 유일하게 존재한다면, X를 십진법으로 표현한 수와 A와 B를 공백으로 나누어 출력하라. 만약 만족하는 경우가 2가지 이상이라면 "Multiple"을, 없다면 "Impossible"을 www.acmicpc.net ▶문제 폰 호석만은 진법 변환의 달인이다. 어떤 진법의 수가 주어져도 모든 다른 진법으로의 변환이 가능한 폰 호석만은 새로운 문제를 내기로 했다. 폰 호석만이 내는 문제는 다음과 같이 진행된다. 먼저 폰 호석만은 수 3개 X, A, B를 결정한다(0 ≤ X < 263, 2 ≤ A ≤ 36, 2 ≤ B ≤ 36, A ≠ B). 이 때 X는 10진법이다. … -
백준 JAVA 9613 GCD 합
백준 JAVA 9613 GCD 합
2021.12.31문제 링크: https://www.acmicpc.net/problem/9613 9613번: GCD 합 첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진 www.acmicpc.net ▶ 해설 n 개의 수가 주어집니다. 각각의 숫자마다의 GCD (최소 공약수)를 구한 후 더한 것을 출력합니다. import java.math.BigInteger; import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws IOExcept… -
백준 JAVA 2407번 조합
백준 JAVA 2407번 조합
2021.12.30문제 링크: https://www.acmicpc.net/problem/2407 2407번: 조합 n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n) www.acmicpc.net ▶ 문제 단순히 조합을 구하는 것이지만 5
댓글을 사용할 수 없습니다.