[백준] 1912: 연속합 - Java (DP)
Algorithm/BackJun 2024. 1. 15.
목 차
- 문제
- 접근 방식
- 풀이
문제

접근 방식
이 문제를 처음 마주하게 되었을 때는 투 포인터 방식으로 풀면 되는 거 아닌가? 왜 DP 문제인 거야? 라고 생각했다.
근데 질문 게시판에서 <투 포인터 방식에 대한 반례> 라는 글이 올라와 있었다.
그래서 DP 문제라는 확신을 가지고 DP 의 개념으로 문제를 보았다.
만약 dp[i - 1], 즉 이전 값이 0보다 작다면 그냥 자기 자신을 dp[i] 번째에 넣으면 된다는 것을 깨닳았다. 그리고 max 값을 저장하는 변수와 비교해서 더 큰 값을 변수에 저장하면 되는 것이었다. 왜냐하면 양의 정수 하나만 존재한다면 마이너스들은 볼 필요도 없을 테니까.
그리고 dp[i - 1] 이 0 보다 큰 양의 정수라면, dp[i - 1] 과 자신을 더한 값을 dp[i] 에 저장하고 max 값과 비교한다.
풀이
package src.DP;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class ContinuousSum {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// Input
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
int[] dp = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
dp[0] = arr[0];
// Main
int answer = dp[0];
for(int i = 1; i < N; i++){
if(dp[i - 1] < 0){
dp[i] = arr[i];
answer = Math.max(dp[i], answer);
continue;
}
dp[i] = dp[i - 1] + arr[i];
answer = Math.max(dp[i], answer);
}
System.out.println(answer);
}
}
'Algorithm > BackJun' 카테고리의 다른 글
[백준] 9465: 스티커 - Java (DP) (0) | 2024.01.21 |
---|---|
[백준] 1003: 피보나치 함수 - Java (DP) (0) | 2024.01.16 |
[백준] 11727: 2 * n 타일링2 - Java (DP) (0) | 2024.01.14 |
[백준] 2606: 바이러스 - Java (그래프 이론) (0) | 2024.01.11 |
[백준] 2178: 미로 탐색 - Java (그래프 이론) (0) | 2024.01.11 |