January 18, 2022
백준 문제 링크 : https://www.acmicpc.net/problem/2096
내려갈 수 있는 최대값과, 최소 값을 구하는 문제이다. N은 100000개이므로 시간초과에 주의해야한다.
maxSum, minSum을 즉 누적합을 만들며 만들며 for문을 진행하면 O(N)으로 만들 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int[][] maxSumBoard = new int[100001][3];
int[][] minSumBoard = new int[100001][3];
for(int i=1; i<=N; i++){
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
maxSumBoard[i][0] = Math.max(maxSumBoard[i-1][0],maxSumBoard[i-1][1]) + num;
minSumBoard[i][0] = Math.min(minSumBoard[i-1][0],minSumBoard[i-1][1]) + num;
num = Integer.parseInt(st.nextToken());
maxSumBoard[i][1] = Math.max(maxSumBoard[i-1][0],Math.max(maxSumBoard[i-1][1], maxSumBoard[i-1][2])) + num;
minSumBoard[i][1] = Math.min(minSumBoard[i-1][0],Math.min(minSumBoard[i-1][1], minSumBoard[i-1][2]) ) + num;
num = Integer.parseInt(st.nextToken());
maxSumBoard[i][2] = Math.max(maxSumBoard[i-1][1],maxSumBoard[i-1][2]) + num;
minSumBoard[i][2] = Math.min(minSumBoard[i-1][1],minSumBoard[i-1][2]) + num;
}
int maxAnswer = Math.max(maxSumBoard[N][0],Math.max(maxSumBoard[N][1], maxSumBoard[N][2]));
int minAnswer = Math.min(minSumBoard[N][0],Math.min(minSumBoard[N][1], minSumBoard[N][2]));
System.out.println(maxAnswer + " " + minAnswer);
}
}