베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 21758번: 꿀 따기

2022. 12. 11. 22:21

태그: Java

21758번: 꿀 따기

 

21758번: 꿀 따기

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

www.acmicpc.net

키워드

  1. 두 마리가 모두 지나간 장소에서는 두 마리 모두 표시된 양 만큼의 꿀을 딴다. (벌통이 있는 장소에서도 같다.)
  2. 벌이 시작한 장소에서는 어떤 벌도 꿀을 딸 수 없다.

구현

  • 꿀의 누적합을 구한다.

3가지 경우의 수가 생긴다.

  1. 꿀통이 0에 있는 경우
    • 어처피 n-1은 못먹으므로, 하나는 무조건 한쪽 끝에 두는 것이 이득이다.
    • 나머지는 전부 돌아가며 최댓값을 찾는다.
  2. 꿀통이 n-1에 있는 경우
    • 어처피 0은 못먹으므로, 하나는 무조건 한 쪽 끝에 두는 것이 이득이다.
    • 나머지는 전부 돌아가며 최댓값을 찾는다.
  3. 꿀통이 중간에 있는 경우
    • 벌을 양 쪽 끝에 두는 것이 이득이다.
    • 한쪽에 2개를 두면 손해인 이유는 그 경우에 꿀통을 한쪽으로 더 밀면 더 많은 꿀을 얻을 수 있기 때문이다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class java_21758 {
    static int N;
    static int hive[];
    static int sumOfHive[];

    static long findMaxValue(int hiveIndex) {
        long result = 0;

        // 한 쪽 끝에 있는 경우
        if (hiveIndex == 0) {
            // 하나는 n-1에 고정
            for (int i = 1; i < N - 1; i++) {
                // n-1 합 저장
                long tmp = sumOfHive[N - 2] - hive[i];

                tmp += sumOfHive[i - 1];

                result = Math.max(result, tmp);
            }

            return result;
        }

        // 한 쪽 끝에 있는 경우
        if (hiveIndex == N - 1) {
            // 하나는 0에 고정
            for (int i = 1; i < N - 1; i++) {
                // [1]~[N-1] 합 저장
                long tmp = sumOfHive[N - 1] - hive[0] - hive[i];

                tmp += sumOfHive[N - 1] - sumOfHive[i];

                result = Math.max(result, tmp);
            }

            return result;
        }

        // 중간에 있는 경우
        // 양쪽 끝에 벌을 둔다.
        // [1]~[hiveIndex]
        // [hiveIndex]~[n-2]
        result += sumOfHive[hiveIndex] - sumOfHive[0];
        result += sumOfHive[N - 2] - sumOfHive[hiveIndex - 1];

        return result;
    }

    static long solution() {
        long result = 0;

        // 벌통의 위치
        for (int i = 0; i < N; i++) {
            result = Math.max(findMaxValue(i), result);
        }

        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 벌통이 한쪽 끝에 있는 경우
        // -> 하나는 무조건 다른 한 쪽 끝 (다른 한 쪽 끝이 MAX값이여도 어처피 못먹음)
        // -> N번 반복해서 최댓값 찾기

        // 벌통이 중간에 있는 경우
        // -> 한쪽 끝에 2개를 두는 것이 이득인가?
        // --> [2]부터 [벌통] 까지 합 * 2
        // -> 양쪽 끝에 2개를 두는 것이 이득인가?
        // --> [1]부터 [벌통] 까지 합 + [벌통]부터 [n-2] 까지 합

        N = Integer.parseInt(br.readLine());
        hive = new int[N];
        sumOfHive = new int[N];

        StringTokenizer st = new StringTokenizer(br.readLine());

        hive[0] = Integer.parseInt(st.nextToken());
        sumOfHive[0] = hive[0];

        for (int i = 1; i < N; i++) {
            hive[i] = Integer.parseInt(st.nextToken());
            sumOfHive[i] = sumOfHive[i - 1] + hive[i];
        }

        long result = solution();

        System.out.println(result);

        br.close();
    }
}

저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 1781번: 컵라면  (0) 2023.01.10
[BOJ/JAVA] 1459번: 걷기  (0) 2022.12.11
[BOJ/JAVA] 2036번: 수열의 점수  (0) 2022.12.11
[BOJ/JAVA] 1783번: 병든 나이트  (0) 2022.12.11
[BOJ/JAVA] 14613번: 너의 티어는?  (0) 2022.12.05
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 1781번: 컵라면
    • [BOJ/JAVA] 1459번: 걷기
    • [BOJ/JAVA] 2036번: 수열의 점수
    • [BOJ/JAVA] 1783번: 병든 나이트
    베오
    베오

    티스토리툴바