Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Java
- 코드트리
- 프로그래밍 언어
- 개발자취업
- 코테공부
- 알고리즘
- til
- 웹
- 티스토리챌린지
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 데이터베이스
- 인접 행렬
- 갭체크
- C
- 코딩테스트사이트추천
- 프로그래머스
- 코딩테스트준비
- 플로이드-워셜
- 운영체제
- 항해99
- 개발자루틴
- 자바스크립트
- 파이썬
- 99클럽
- 자바
- 1일1코테
- 자료구조
- 오블완
- 코딩테스트
- 연결 리스트
Archives
- Today
- Total
와드의 블로그
1912번: 연속합 본문
문제
n개의 정수로 이루어진 임의의 수열이 주어집니다. 우리는 이 중 연속된 몇 개의 숫자를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 합니다. 단, 숫자는 적어도 하나 이상 선택해야 합니다.
- 입력: 첫째 줄에 정수 n (1 ≤ n ≤ 100,000)이 주어지고, 둘째 줄에 n개의 정수로 이루어진 수열이 주어집니다.
- 출력: 첫째 줄에 가장 큰 연속합을 출력합니다.
링크: https://www.acmicpc.net/problem/1912
풀이: 다이나믹 프로그래밍 (DP)
이 문제는 이전까지의 계산 결과를 활용하여 현재의 최적해를 구하는 전형적인 다이나믹 프로그래밍(DP) 문제입니다. (카데인 알고리즘과 동일한 원리입니다.)
- DP 배열 정의: d[i]를 i번째 원소를 마지막으로 포함하는 연속 부분 수열의 최대 합이라고 정의합니다.
- 점화식 도출: i번째 원소에서 선택할 수 있는 경우는 두 가지입니다.
- 이전까지의 연속합에 현재 숫자를 이어 붙이는 경우: d[i - 1] + a[i]
- 이전까지의 연속합을 끊고, 현재 숫자부터 새롭게 연속합을 시작하는 경우: a[i]
- 최댓값 갱신: 수열 내에 음수가 모두 포함되어 있을 수 있으므로, 연속합의 최댓값을 저장할 변수 ans의 초기값은 Integer.MIN_VALUE로 설정해야 합니다. d 배열을 채워나가면서 매번 ans를 갱신해 주면, 최종적으로 전체 수열에서의 가장 큰 연속합을 얻을 수 있습니다.
코드
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));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] a = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
int[] d = new int[n];
Arrays.fill(d, Integer.MIN_VALUE);
int ans = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
d[i] = a[i];
if (i > 0) {
d[i] = Math.max(d[i - 1] + a[i], d[i]);
}
ans = Math.max(ans, d[i]);
}
bw.write(ans + "");
bw.flush();
bw.close();
br.close();
}
}
알고리즘 분류
다이나믹 프로그래밍 (DP)
'PS > B.O.J' 카테고리의 다른 글
| 14889번: 스타트와 링크 (0) | 2026.04.01 |
|---|---|
| 14469번: 소가 길을 건너간 이유 3 (0) | 2026.03.31 |
| 19942번: 다이어트 (0) | 2026.03.31 |
| 3273번: 두 수의 합 (0) | 2026.03.30 |
| 11723번: 집합 (0) | 2026.03.30 |