diff --git "a/\355\225\234\353\257\274\354\243\274/20250315/P2156.java" "b/\355\225\234\353\257\274\354\243\274/20250315/P2156.java" new file mode 100644 index 0000000..224670f --- /dev/null +++ "b/\355\225\234\353\257\274\354\243\274/20250315/P2156.java" @@ -0,0 +1,50 @@ +package algorithm; +// 메모리: 13288 kb, 시간: 88ms +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class P2156 { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + int wine[] = new int[n]; + int drink[][] = new int[n][2]; + + for (int i = 0; i < n; i++) { + wine[i] = Integer.parseInt(br.readLine()); + } + + if (n <= 2) { + int sum = 0; + for (int i = 0; i < n; i++) { + sum += wine[i]; + } + System.out.println(sum); + return; + } + for (int i = 0; i < n; i++) { + if (i == 0) { + drink[i][0] = wine[i]; + continue; + } + if (i == 1) { + drink[i][0] = wine[i]; + } + if (i > 1) { + drink[i][0] = Math.max(drink[i - 2][0] + wine[i], drink[i - 2][1] + wine[i]); + } + if (i > 2) { + drink[i][0] = Math.max(Math.max(drink[i][0], drink[i - 3][1] + wine[i]), drink[i - 3][0] + wine[i]); + } + drink[i][1] = drink[i - 1][0] + wine[i]; + } + + int ans = 0; + for (int i = n - 2; i < n; i++) { + ans = Math.max(ans, Math.max(drink[i][0], drink[i][1])); + } + System.out.println(ans); + } + +} diff --git "a/\355\225\234\353\257\274\354\243\274/20250315/P21758.java" "b/\355\225\234\353\257\274\354\243\274/20250315/P21758.java" new file mode 100644 index 0000000..2722aa8 --- /dev/null +++ "b/\355\225\234\353\257\274\354\243\274/20250315/P21758.java" @@ -0,0 +1,52 @@ +package algorithm; + +// 메모리: 25296kb, 시간: 192ms +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class P21758 { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + + if (n == 3) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int a = Integer.parseInt(st.nextToken()); + int b = Integer.parseInt(st.nextToken()); + int c = Integer.parseInt(st.nextToken()); + System.out.println(Math.max(a, Math.max(b, c)) * 2); + return; + } + + int sum[] = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + sum[0] = Integer.parseInt(st.nextToken()); + for (int i = 1; i < n; i++) { + sum[i] = sum[i - 1] + Integer.parseInt(st.nextToken()); + } + + int allSum = sum[n - 1]; + // 벌통이 오른쪽 끝에 있을 때 + int minus = allSum; + for (int i = 1; i < n - 1; i++) { + minus = Math.min(minus, sum[i] + sum[i] - sum[i - 1] + sum[0]); + if (sum[i] - sum[0] >= minus) { + break; + } + } + + // 벌통이 왼쪽 끝에 있을 때 + for (int i = n - 2; i > 0; i--) { + minus = Math.min(minus, sum[n - 1] - sum[i - 1] + sum[n - 1] - sum[n - 2] + sum[i] - sum[i - 1]); + if (sum[n - 1] - sum[i - 1] >= minus) { + break; + } + } + + System.out.println(allSum * 2 - minus); + + } + +} diff --git "a/\355\225\234\353\257\274\354\243\274/20250317/P2616.java" "b/\355\225\234\353\257\274\354\243\274/20250317/P2616.java" new file mode 100644 index 0000000..36ede01 --- /dev/null +++ "b/\355\225\234\353\257\274\354\243\274/20250317/P2616.java" @@ -0,0 +1,50 @@ +package algorithm; +// 메모리: 19992kb, 시간: 156ms + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.StringTokenizer; + +public class P2616 { + + public static void main(String[] args) throws Exception { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int n = Integer.parseInt(br.readLine()); + + int people[] = new int[n]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 0; i < n; i++) { + people[i] = Integer.parseInt(st.nextToken()); + } + + int k = Integer.parseInt(br.readLine()); + + // 누적합 구하기 + int sum[] = new int[n]; + for (int i = 0; i < n; i++) { + if (i >= 1) + sum[i] += people[i] + sum[i - 1]; + else + sum[i] += people[i]; + if (i >= k) { + sum[i] -= people[i - k]; + } + } + + int dp[][] = new int[n][3]; + + // i번째 + for (int i = k - 1; i < n; i++) { + dp[i][0] = Math.max(dp[i - 1][0], sum[i]); + if (i - k > 0) { + dp[i][1] = Math.max(dp[i - 1][1], dp[i - k][0] + sum[i]); + dp[i][2] = Math.max(dp[i - 1][2], dp[i - k][1] + sum[i]); + } + } + + + + System.out.println(dp[n - 1][2]); + } + +}