우당탕탕 개발자 되기
백준_연속합(1912) In Java 본문
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
풀이
- 처음 문제를 읽었을 때 오름차순으로 정렬 후 양수인 수를 전부더하면 된다고 생각했는데, 문제는 배열에 손을 대지 않고 연속적인 숫자 합을 구하는 문제이다
- dp 배열에는 ar[i] 까지 배열에서의 총합중 최대값이 들어있는 배열이 dp[i] 가 된다.
- 다이나믹 프로그래밍으로서 Top-Down 방법, Bottom-Up 방식이 있다
Top-Down
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int max;
static Integer[] dp;
static int[] ar;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
ar=new int[N];
dp=new Integer[N];
StringTokenizer st=new StringTokenizer(br.readLine()," ");
for (int i = 0; i < N; i++) {
ar[i] = Integer.parseInt(st.nextToken());
}
dp[0] = ar[0];
max=ar[0];
recur(N-1);
System.out.println(max);
}
static int recur(int N){
if(dp[N]==null){
dp[N]=Math.max(recur(N-1)+ar[N],ar[N]);
max=Math.max(dp[N],max);
}
return dp[N];
}
}
Bottom-Up
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
int[] ar=new int[N];
int[] dp=new int[N];
StringTokenizer st=new StringTokenizer(br.readLine()," ");
for (int i = 0; i < N; i++) {
ar[i] = Integer.parseInt(st.nextToken());
}
dp[0] = ar[0];
int max=ar[0];
for (int i = 1; i < N; i++) {
dp[i]=Math.max(dp[i-1]+ar[i],ar[i]);
max=Math.max(max,dp[i]);
}
System.out.println(max);
}
}
성능

Top-Down 방식은 재귀를 이용하여 함수를 호출할 떄마다 오버헤드가 발생하여 Bottom-Up 방식이 시간 이나 메모리 측면에서 좀 더 효율적이다.
동적프로그래밍 문제는 문제를 생각해보고 직접 확인해보면서 점화식을 세우는 것이 제일 중요한거같다.
'자료구조&알고리즘' 카테고리의 다른 글
| 백준_가장 큰 증가 부분수열(11055) In Java (0) | 2021.08.02 |
|---|---|
| 백준_가장 긴 증가하는 부분 수열(11053) In Java (0) | 2021.08.02 |
| 백준_회의실 배정(1931) In Java (0) | 2021.07.30 |
| 프로그래머스_ H-Index in Java (0) | 2021.07.30 |
| 프로그래머스_가장 큰 수 In Java (0) | 2021.07.30 |