문제 링크: https://www.acmicpc.net/problem/21758

 

21758번: 꿀 따기

첫 번째 줄에 가능한 최대의 꿀의 양을 출력한다.

www.acmicpc.net

 

▶ 문제


 

▶ 해설 


총 3 가지의 케이스로 분류할 수 있다.

 

1. 벌벌 ~~꿀,   꿀 ~~ 벌벌 

-> 벌 두 마리가 붙어있고, 꿀이 끝에 있을 때

2. 벌 ~ 벌 ~~꿀,  꿀 ~~ 벌 ~ 벌

-> 벌이 붙어 있지 않고 꿀이 끝에 있을 때

3. 벌 ~ 꿀 ~ 벌

-> 벌과 벌 사이에 꿀이 있을 때

 

import java.util.*;
import java.io.*;
public class Main {
static int n;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
arr = new int[n+1];
String[] s = br.readLine().split(" ");
for (int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(s[i-1]);
}
int temp = 0;
int ans = 0;
// 1. 벌벌 꿀
ans = togetherBee(temp, ans);
// 2. 벌 벌 꿀
ans = fallBee(ans);
// 3. 벌 꿀 벌
int pos = 2;
ans = betweenBee(ans, pos);
System.out.println(ans);
}
private static int fallBee(int ans) {
int temp;
int i = 1;
for (int j = i + 1; j <= n - 1; j++) {
temp = 0;
for (int x = j + 1; x <= n; x++) {
temp += arr[x];
}
for (int x = i + 1; x <= n; x++) {
if (x == j) continue;
temp += arr[x];
}
if (temp > ans) {
ans = temp;
}
}
i = n;
for (int j = i - 1; j >= 2; j--) {
temp = 0;
for (int x = j - 1; x >= 1; x--) {
temp += arr[x];
}
for (int x = i - 1; x >= 1; x--) {
if (x == j) continue;
temp += arr[x];
}
if (temp > ans) {
ans = temp;
}
}
return ans;
}
private static int betweenBee(int ans, int pos) {
int i;
int temp;
while (pos < n) {
temp = 0;
for (i = 2; i <= pos; i++) {
temp += arr[i];
}
for (int j = n - 1; j >= pos; j--) {
temp += arr[j];
}
if (temp > ans) {
ans = temp;
}
pos++;
}
return ans;
}
private static int togetherBee(int temp, int ans) {
for (int i = 3; i <= n; i++) {
temp += arr[i];
}
if (temp > ans) {
ans = temp;
temp = 0;
}
for (int i = n - 2; i >= 1; i--) {
temp += arr[i];
}
if (temp > ans) {
ans = temp;
temp = 0;
}
return ans;
}
}

 

아쉽게도 55점을 받았다.. 나중에 다시 풀어봐야 할 것 같다.. ㅠㅠ