알고리즘/다이나믹프로그래밍(Dynamic Programming)
[백준-1912]-[다이나믹프로그래밍] - 연속합
팡스
2018. 11. 11. 14:29
문제경로 : https://www.acmicpc.net/problem/1912
이문제는 굉장이 간단하게 접근 할 수 있다.
제공된 예제를 바탕으로 문제를 풀어보자.
10 10 -4 3 1 5 6 -35 12 21 -1
총 10개의 정수가 제공 되고 연속된 구간의 합 중에서 제일 큰 값이 무엇인지 출력해주면 된다.
출력은 33이 출력이 돼야 한다.
이문제를 간단하기 풀기 위해선 배열의 크기를 입력받은 사이즈 보다 한칸 더 크게 생성하면 쉽고 짧게 풀 수 있다.
첫번째 입력을 배열의 인덱스 0에 저장하지 말고 1에 저장하면 된다.
이문제를 풀기위해 필요한 변수는 구간합의 최대값을 저장하는 max 라는 변수와 입력받은 값들을 저장할 long 타입의 일차원 배열만 있으면 풀 수 있다.
1 2 3 4 5 6 7 | public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); // 수를 입력받을 횟수 long max = Long.MIN_VALUE; // 구간합의 최대값을 저장할 변수 long[] arr = new long[num+1]; // 입력받은 수 또는 구간합을 저장할 long 타입 일차원 배열 } | cs |
문제를 푸는 방법은 입력받은 횟수만큼 반복을 하면서 현재 인덱스에 입력받은 수와 이전 인덱스의 값의 합이 현재 입력 받은 수보다 크면 현재 인덱스에 값을 저장하고
그 값이 max 보다도 크면 max의 값까지 변경해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 | for(int i=1; i <= num; i++) { arr[i] = sc.nextLong(); // 구간합 구하기 if(arr[i] + arr[i-1] > arr[i]) arr[i] = arr[i] + arr[i-1]; // 현재 구간합이 max보다 크면 max 값 변경하기 if(arr[i] > max) max = arr[i]; } } | cs |
여기서 제일 중요한 것이 있는데 반복도 아니고 조건도 아닌 max 값의 초기 값이다.
max의 값을 0으로 초기화 한다면 모든 수가 음수로 입력 됐을때 출력이 0이 된다.
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); // 수를 입력받을 횟수 long max = Long.MIN_VALUE; // 구간합의 최대값을 저장할 변수 long[] arr = new long[num+1]; // 입력받은 수 또는 구간합을 저장할 long 타입 일차원 배열 for(int i=1; i <= num; i++) { arr[i] = sc.nextLong(); // 구간합 구하기 if(arr[i] + arr[i-1] > arr[i]) arr[i] = arr[i] + arr[i-1]; // 현재 구간합이 max보다 크면 max 값 변경하기 if(arr[i] > max) max = arr[i]; } System.out.println(max); } | cs |