문제 링크: 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점을 받았다.. 나중에 다시 풀어봐야 할 것 같다.. ㅠㅠ