728x90
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
풀이)
<틀린답>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BJ_1912_연속합 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
int[] sum = new int[n+1];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
int s = arr[0];
for(int i=1; i<=n; i++){
if(i==1)
sum[i] = s;
else{
sum[i] = s+arr[i-1];
s += arr[i-1];
}
}
int ans = Integer.MIN_VALUE;
for(int i=0; i<n; i++){
for(int j=i+1; j<=n; j++){
ans = Math.max(ans, sum[j]-sum[i]);
}
}
System.out.println(ans);
}//main
}
처음에는 누적합으로 풀면 되겠다~ 했는데 시간초과 났다.
당연히 10만 * 10만 = 100억...이라서 100초 걸리는 거였음....
<정답>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BJ_1912_연속합 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
int[] sum = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
sum[0] = arr[0];
int ans = arr[0];
for(int i=1; i<n; i++){
sum[i] = Math.max(sum[i-1]+arr[i], arr[i]);
ans = Math.max(ans, sum[i]);
}
System.out.println(ans);
}//main
}
연속되면서 가장 큰 합을 찾으면 되기 때문에 dp 배열을 하나 만든다.
그후 차례로 "이전까지의 최대값 + 현재값"과 현재 값을 비교한다.
만약 현재값이 더 크면 현재값에서부터 누적해서 더 큰 값을 찾는다고 생각하면 쉽다!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 1713 후보 추천하기(JAVA) (0) | 2023.06.05 |
---|---|
백준 7562 나이트의 이동(JAVA) (0) | 2023.06.04 |
백준 15651 N과 M(3) (JAVA) (0) | 2023.05.31 |
백준 11729 하노이 탑 이동 순서(JAVA) (0) | 2023.05.29 |
백준 14889 스타트와 링크(JAVA) (0) | 2023.05.23 |